c语言链表注意事项,C语言链表创建问题

C语言链表创建问题

答案:2  信息版本:手机版

解决时间 2019-10-06 18:16

已解决

2019-10-06 03:21

#include"stdio.h"#include"string.h"#include"stdlib.h"#include"ctype.h"typedef struct node //定义结点{char data[10]; //结点的数据域为字符串struct node *next; //结点的指针域}ListNode;typedef ListNode * LinkList; // 自定义LinkList单链表类型LinkList CreatListR1(); //函数,用尾插入法建立带头结点的单链表ListNode *LocateNode(); //函数,按值查找结点void DeleteList(); //函数,删除指定值的结点void printlist(); //函数,打印链表中的所有值void DeleteAll(); //函数,删除所有结点,释放内存//==========主函数==============void main(){char ch[10],num[10];LinkList head;head=CreatListR1(); //用尾插入法建立单链表,返回头指针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",ch); //输入要删除的字符串DeleteList(head,ch);printlist(head);}DeleteAll(head); //删除所有结点,释放内存}//==========用尾插入法建立带头结点的单链表===========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(p==NULL ) { //若没有找到结点,退出printf("position error");exit(0);}while(q->next!=p) //p为要删除的结点,q为p的前结点q=q->next;r=q->next;q->next=r->next;free(r); //释放结点}//===========打印链表=======void printlist(LinkList head){ListNode *p=head->next; //从开始结点打印while(p){printf("%s, ",p->data);p=p->next;}printf("\n");}//==========删除所有结点,释放空间===========void DeleteAll(LinkList head){ListNode *p=head,*r;while(p->next){r=p->next;free(p);p=r;}free(p);}为什么输入两次就内存报错啊?谢谢各位回答者的相助

最佳答案

2019-10-06 04:26

删除所有结点,释放内存}//==========用尾插入法建立带头结点的单链表===========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

全部回答

1楼

2019-10-06 05:28

两个问题:

第一:在listnode *locatenode(linklist head, char *key)函数中,扫描节点

while(strcmp(p->data,key)!=0 && p) //直到p为null或p-> data为key止

应该先判断p是否是结点.改为:

while(p && strcmp(p->data,key)!=0) //直到p为null或p-> data为key止

第二:在linklist creatlistr1(void)函数中,while每次都要获取输入. 否则第一.二个节点会重复.

另外一个小问题:函数声明时,缺少形参.

以下是修改后的代码: #include"stdio.h"

#include"string.h"

#include"stdlib.h"

#include"ctype.h"

typedef struct node //定义结点

{

char data[10]; //结点的数据域为字符串

struct node *next; //结点的指针域

}listnode;

typedef listnode * linklist; // 自定义linklist单链表类型

linklist creatlistr1(void); //函数,用尾插入法建立带头结点的单链表

listnode *locatenode(linklist head, char *key); //函数,按值查找结点

void deletelist(linklist head,char *key); //函数,删除指定值的结点

void printlist(linklist head); //函数,打印链表中的所有值

void deleteall(linklist head); //函数,删除所有结点,释放内存

//==========主函数==============

void main()

{

char ch[10],num[10];

linklist head;

head=creatlistr1(); //用尾插入法建立单链表,返回头指针

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",ch); //输入要删除的字符串

deletelist(head,ch);

printlist(head);

}

deleteall(head); //删除所有结点,释放内存

}

//==========用尾插入法建立带头结点的单链表===========

linklist creatlistr1(void)

{

char ch[10];

linklist head=(linklist)malloc(sizeof(listnode)); //生成头结点

int i=0;

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;

}

}

//头节点建立后没有获取输入,所以用同样的ch创建了两个节点.

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(p && strcmp(p->data,key)!=0) //直到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(p==null ) { //若没有找到结点,退出

printf("position error");

exit(0);

}

while(q->next!=p) //p为要删除的结点,q为p的前结点

q=q->next;

r=q->next;

q->next=r->next;

free(r); //释放结点

}

//===========打印链表=======

void printlist(linklist head)

{

listnode *p=head->next; //从开始结点打印

while(p){

printf("%s, ",p->data);

p=p->next;

}

printf("\n");

}

//==========删除所有结点,释放空间===========

void deleteall(linklist head)

{

listnode *p=head,*r;

while(p->next){

r=p->next;

free(p);

p=r;

}

free(p);

}

有问题还请追问.

我要举报

如果感觉以上信息为低俗/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!

大家都在看

推荐资讯

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值