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);
}
有问题还请追问.
我要举报
如果感觉以上信息为低俗/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!
大家都在看
推荐资讯