c语言简便实现链表增删改查

兔老大 发表于 2021/04/19 23:43:28 2021/04/19
【摘要】  注:单追求代码简洁,所以写法可能有点不标准。 //第一次拿c开始写数据结构,因为自己写的,追求代码量少,和学院ppt不太一样。有错请指出#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct node//定义节点{ int data; str...

 注:单追求代码简洁,所以写法可能有点不标准。


  
  1. //第一次拿c开始写数据结构,因为自己写的,追求代码量少,和学院ppt不太一样。有错请指出
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. typedef struct node//定义节点
  6. {
  7. int data;
  8. struct node * next;
  9. }Node;

 


  
  1. //函数介绍
  2. void printlist(Node * head)//打印链表
  3. int lenlist(Node * head)//返回链表长度
  4. void insertlist(Node ** list,int data,int index)//插入元素
  5. void pushback(Node ** head,int data)//尾部插入
  6. void freelist(Node ** head)//清空链表
  7. void deletelist(Node ** list,int data)//删除元素
  8. Node * findnode(Node ** list,int data)//查找
  9. void change(Node ** list,int data,int temp)//改变值

打印


  
  1. void printlist(Node * head)//打印链表
  2. {
  3. for(;head!=NULL;head=head->next) printf("%d ",head->data);
  4. printf("\n");//为了其他函数打印,最后换行
  5. }

链表长度


  
  1. int lenlist(Node * head)//返回链表长度
  2. {
  3. int len;
  4. Node * temp = head;
  5. for(len=0; temp!=NULL; len++) temp=temp->next;
  6. return len;
  7. }

插入元素


  
  1. void insertlist(Node ** list,int data,int index)//插入元素,用*list将head指针和next统一表示
  2. {
  3. if(index<0 || index>lenlist(*list))return;//判断非法输入
  4. Node * newnode=(Node *)malloc(sizeof(Node));//创建
  5. newnode->data=data;
  6. newnode->next=NULL;
  7. while(index--)list=&((*list)->next);//插入
  8. newnode->next=*list;
  9. *list=newnode;
  10. }

尾部增加元素


  
  1. void pushback(Node ** head,int data)//尾插,同上
  2. {
  3. Node * newnode=(Node *)malloc(sizeof(Node));//创建
  4. newnode->data=data;
  5. newnode->next=NULL;
  6. while(*head!=NULL)head=&((*head)->next);//插入
  7. *head=newnode;
  8. }

清空链表


  
  1. void freelist(Node ** head)//清空链表
  2. {
  3. Node * temp=*head;
  4. Node * ttemp;
  5. *head=NULL;//指针设为空
  6. while(temp!=NULL)//释放
  7. {
  8. ttemp=temp;
  9. temp=temp->next;
  10. free(ttemp);
  11. }
  12. }

删除


  
  1. void deletelist(Node ** list,int data)//删除链表节点
  2. {
  3. Node * temp;//作用只是方便free
  4. while((*list)->data!=data && (*list)->next!=NULL)list=&((*list)->next);
  5. if((*list)->data==data){
  6. temp=*list;
  7. *list=(*list)->next;
  8. free(temp);
  9. }
  10. }

查找


  
  1. Node * findnode(Node ** list,int data)//查找,返回指向节点的指针,若无返回空
  2. {
  3. while((*list)->data!=data && (*list)!=NULL) list=&((*list)->next);
  4. return *list;
  5. }

改值


  
  1. void change(Node ** list,int data,int temp)//改变
  2. {
  3. while((*list)->data!=data && (*list)->next!=NULL)list=&((*list)->next);
  4. if((*list)->data==data)(*list)->data=temp;
  5. }

 

最后测试


  
  1. int main(void)//测试
  2. {
  3. Node * head=NULL;
  4. Node ** gg=&head;
  5. int i;
  6. for(i=0;i<10;i++)pushback(gg,i);
  7. printf("链表元素依次为: ");
  8. printlist(head);
  9. printf("长度为%d\n",lenlist(head));
  10. freelist(gg);
  11. printf("释放后长度为%d\n",lenlist(head));
  12. for(i=0;i<10;i++)pushback(gg,i);
  13. deletelist(gg,0);//头
  14. deletelist(gg,9);//尾
  15. deletelist(gg,5);
  16. deletelist(gg,100);//不存在
  17. printf("再次创建链表,删除节点后\n");
  18. printlist(head);
  19. freelist(gg);
  20. for(i=0;i<5;i++)pushback(gg,i);
  21. insertlist(gg,5,0);//头
  22. insertlist(gg,5,5);
  23. insertlist(gg,5,7);//尾
  24. insertlist(gg,5,10);//不存在
  25. printlist(head);
  26. printf("找到%d\n把3变为100",*findnode(gg,5));
  27. change(gg,3,100);
  28. change(gg,11111,1);//不存在
  29. printlist(head);
  30. }

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/81261043

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。