删除所有结点,释放内存}//==========用尾插入法建立带头结点的单链表===========LinkList CreatListR1(void){char ch[10];LinkList head=(LinkList)malloc(sizeof(ListNode)); //生成头结点ListNode *s,*pp,*r;r=head;r->next=NULL;printf("Input # to end "); //输入"#"代表输入结束printf("Please input Node_data:");scanf("%s",ch); //输入各结点的字符串 while(strcmp(ch,"#")!=0){if(head->next==NULL){s=(ListNode *)malloc(sizeof(ListNode));strcpy(s->data,ch);head->next=s;r=s;s->next=NULL;}else{pp=LocateNode(head,ch); //按值查找结点,返回结点指针if(pp==NULL) //如果没有重复的字符串,才插入到链表中{ s=(ListNode *)malloc(sizeof(ListNode));strcpy(s->data,ch);r->next=s;r=s;s->next=NULL;}printf("Input # to end ");printf("Please input Node_data:");scanf("%s",ch);}}return head; //返回头指针}//==========按值查找结点,找到则返回该结点的位置,否则返回NULL==========ListNode *LocateNode(LinkList head, char *key){ListNode *p=head->next; //从开始结点比较while(strcmp(p->data,key)!=0 && p) //直到p为NULL或p-> data为key止p=p->next; //扫描下一个结点return p; //若p=NULL则查找失败,否则p指向找到的值为key的结点}//==========删除带头结点的单链表中的指定结点=======void DeleteList(LinkList head,char *key){ListNode *p,*r,*q=head;p=LocateNode(head,key); //按key值查找结点的if
/*
Please input Node_data(# to QUIT!) : 三国演义
Please input Node_data(# to QUIT!) : 水浒
Please input Node_data(# to QUIT!) : 西游记
Please input Node_data(# to QUIT!) : 西厢记
Please input Node_data(# to QUIT!) : 桃花扇
Please input Node_data(# to QUIT!) : 洪秀全起义
Please input Node_data(# to QUIT!) : 太平天国
Please input Node_data(# to QUIT!) : #
三国演义, 水浒, 西游记, 西厢记, 桃花扇, 洪秀全起义, 太平天国,
Delete node (y/n):y
Please input Delete_data:水浒
三国演义, 西游记, 西厢记, 桃花扇, 洪秀全起义, 太平天国,
Press any key to continue
*/
#include
#include
#include
#include
typedef struct node { //定义结点
char data[81]; //结点的数据域为字符串
struct node *next; //结点的指针域
}*LinkList,*ListNode;
LinkList CreatList(); //函数,用尾插入法建立带头结点的单链表
ListNode LocateNode(LinkList head, char *s); //函数,按值查找结点
void DeleteNode(LinkList head, char *s); //函数,删除指定值的结点
void PrintList(LinkList head); //函数,打印链表中的所有值
void DeleteList(LinkList head); //函数,删除所有结点,释放内存
//==========主函数==============
void main() {
char s[81],num[10];
LinkList head;
head = CreatList(); //用尾插入法建立单链表,返回头指针
PrintList(head); //遍历链表输出其值
printf(" Delete node (y/n):"); //输入"y"或"n"去选择是否删除结点
scanf("%s",num);
if(strcmp(num,"y") == 0 || strcmp(num,"Y") == 0) {
printf("Please input Delete_data:");
scanf("%s",s); //输入要删除的字符串
DeleteNode(head,s);
PrintList(head);
}
DeleteList(head); //删除所有结点,释放内存}//==========用尾插入法建立带头结点的单链表===========
}
LinkList CreatList(void) {
char s[81];
LinkList head;
ListNode p,q;
head = p = (LinkList)malloc(sizeof(node)); //生成头结点
while(1) {
printf("Please input Node_data(# to QUIT!) : ");
scanf("%s",s); //输入各结点的字符串
if(strcmp(s,"#") == 0) break;
q = (LinkList)malloc(sizeof(node));
strcpy(q->data,s);
p->next = q;
p = q;
}
p->next = NULL;
return head;
}
//==========按值查找结点,找到则返回该结点的位置,否则返回NULL==========
ListNode LocateNode(LinkList head, char *key) {
ListNode p = head->next; //从开始结点比较
while(strcmp(p->data,key) != 0) //直到p为NULL或p->data为key止
p = p->next; //扫描下一个结点
return p; //若p=NULL则查找失败,否则p指向找到的值为key的结点
}
//==========删除带头结点的单链表中的指定结点=======
void DeleteNode(LinkList head,char *key) {
ListNode q,p = head;
while(p->next != NULL) {
if(strcmp(p->next->data,key) == 0) {
q = p->next;
p->next = q->next;
free(q);
return;
}
else p = p->next;
}
printf("没找到数据为%s的结点。\n",p->data);
}
void PrintList(LinkList head) {
LinkList p = head->next; //从开始结点打印
while(p) {
printf("%s, ",p->data);
p = p->next;
}
printf("\n");
}
//==========删除所有结点,释放空间===========
void DeleteList(LinkList head) {
ListNode q,p = head;
while(p->next) {
q = p->next;
p->next = q->next;
free(q);
}
free(head);
}