永发信息网

C语言链表创建问题

答案:1  悬赏:30  手机版
解决时间 2021-07-19 19:03

#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);
}
为什么输入两次就内存报错啊?谢谢各位回答者的相助

最佳答案

两个问题:


第一:在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);
}



有问题还请追问.

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
真心对待一个人也有错吗???
解除劳动合同需要备案吗?
爱过后真的能轻易忘掉吗?
假如超市找钱少给了该怎么办?
诛仙六道注册VIP激活码现在为什么不能收东西
《水浒传》有罗贯中编写的部分吗?
苏州邮寄礼物到黑龙江齐齐哈尔该怎么弄?
梦幻西游的辅助技能问题
一米六六的女生一百一十三斤,这种身材会怎么
幫忙解決下面數學題答案(要過程)三年級
华硕K401N和F83Se/T和惠普4411S哪个好?
形容一些困难性的词语!
为什么在班里唱歌很顺畅而在电脑前就觉得唱不
谁能教教俺股市
2010年SJ的廣州站真的要取消麼?
推荐资讯
比较瘦的男人穿什么衣服比较好看
在一次跳绳比赛中,某小组10名同学的平均成绩
宋惠乔的男朋友是谁??
如何免跳线CPU在BIOS中设置? 知道的帮忙
三星S850这款机怎么样?
SOP·CN―m98那有卖?知道的请告诉我谢谢!
北京哪里有卖可爱旅行箱
12月5号是阴历几月几号?
从石桥铺到经开区民政局怎么走
占有欲强也是错么?
灰太狼与喜羊羊…
广东那个车站有车到广西、北海、合浦县的闸口
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?