c语言链表中求最高分百度文库,C语言链表创建问题

本文介绍了一个关于单链表的C语言代码实现,包括尾插入法建立链表、按值查找节点、删除指定节点和打印链表等功能。主要修复了两个问题:在LocateNode函数中,避免了不必要的比较条件;在CreatListR1函数中,修正了重复插入节点的错误。同时,提供了完整的代码实现和操作流程。
摘要由CSDN通过智能技术生成

两个问题:第一:在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("

");

}

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

void DeleteAll(LinkList head)

{

ListNode *p=head,*r;

while(p->next){

r=p->next;

free(p);

p=r;

}

free(p);

}

有问题还请追问。

全部

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值