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

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

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


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

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

打印


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

链表长度


      int lenlist(Node * head)//返回链表长度
      {
      int len;
       Node * temp = head;
      for(len=0; temp!=NULL; len++) temp=temp->next;
      return len;
      }
  
 

插入元素


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

尾部增加元素


      void pushback(Node ** head,int data)//尾插,同上
      {
       Node * newnode=(Node *)malloc(sizeof(Node));//创建
       newnode->data=data;
       newnode->next=NULL;
      while(*head!=NULL)head=&((*head)->next);//插入
       *head=newnode;
      }
  
 

清空链表


      void freelist(Node ** head)//清空链表
      {
       Node * temp=*head;
       Node * ttemp;
       *head=NULL;//指针设为空
      while(temp!=NULL)//释放
       {
       ttemp=temp;
       temp=temp->next;
      free(ttemp);
       }
      }
  
 

删除


      void deletelist(Node ** list,int data)//删除链表节点
      {
       Node * temp;//作用只是方便free
      while((*list)->data!=data && (*list)->next!=NULL)list=&((*list)->next);
      if((*list)->data==data){
       temp=*list;
       *list=(*list)->next;
      free(temp);
       }
      }
  
 

查找


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

改值


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

最后测试


      int main(void)//测试
      {
       Node * head=NULL;
       Node ** gg=&head;
      int i;
      for(i=0;i<10;i++)pushback(gg,i);
      printf("链表元素依次为: ");
       printlist(head);
      printf("长度为%d\n",lenlist(head));
       freelist(gg);
      printf("释放后长度为%d\n",lenlist(head));
      for(i=0;i<10;i++)pushback(gg,i);
       deletelist(gg,0);//头
       deletelist(gg,9);//尾
       deletelist(gg,5);
       deletelist(gg,100);//不存在
      printf("再次创建链表,删除节点后\n");
       printlist(head);
       freelist(gg);
      for(i=0;i<5;i++)pushback(gg,i);
       insertlist(gg,5,0);//头
       insertlist(gg,5,5);
       insertlist(gg,5,7);//尾
       insertlist(gg,5,10);//不存在
       printlist(head);
      printf("找到%d\n把3变为100",*findnode(gg,5));
       change(gg,3,100);
       change(gg,11111,1);//不存在
       printlist(head);
      }
  
 

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

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

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

作者其他文章

评论(0

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

    全部回复

    上滑加载中

    设置昵称

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

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

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