链表的基本操作

本文介绍了链表的基本概念,强调了链表非连续内存的存储特性,并详细阐述了如何在C语言中进行链表的创建、插入节点、删除节点以及销毁链表的操作,同时提醒了在实际编程中需要注意的指针参数传递问题。
摘要由CSDN通过智能技术生成

很久没写博客了,最近也比较忙~哎,天生ds命。今天一个学妹问链表相关的知识,借此之际正好总结一下链表的基本操作。


1、基本介绍:

链表是一种线性表,逻辑组织形式是一维的。链表的物理存储结构式用一组任意地址的内存单元,不是像顺序表那样占用一串连续的内存单元。

2、基本操作:(以C语言为例)

使用链表首先要建立一个结构体,其基本由数据域和指针域组成。通常还有一个“表头”,用来存放第一个节点的地址,本身不带数据。最后一个节点指针域一般为NULL。

节点描述如下:

typedef struct node{
   ElemTyep data;   //这里用ElemType指代任何类型
   struct node *next;
}LNode,*LinkList;

这里注意一点就好了:  LNode *L 和  LinkList L  这两句话是等价的。

创建链表:

LinkList createLinkList(int n){
   LinkList p,r,list=null;
   ElemType e;
   int i;
   for(i=1;i<=n;i++){
      p=(LinkList)malloc(sizeof(LNode));
      p->data=e;
      p->next=null;
      if(!list)
         list=p;
      else
         r->next=p;
      r=p;
   }
   return list;
}

这里list为头指针,最后用来返回。r用来指向结尾节点。


链表插入:(向q节点后面插入节点)

void insertList(LinkList *list,LinkList q,ElemType e){
   LinkList p;
   p=(LinkList)malloc(sizeof(LNode));
   p->data=e;
   if(!*list){
      *list=p;
      p->next=null;
   }
   else{
      p->next=q->next;
      q->next=p;
   }
      
}

这里注意的是函数中的参数 LinkList *list ,它是指向LinkList类型的指针,也就是指向LNode类型的指针的指针。这是因为函数中要对list,也就是表头指针进行修改,当调用该函数时,实参应该为&list,而不是list。因此必须采用指针参数传递的方法,否则无法再被调函数中修改主函数中定义的变量的内容。


删除节点:

从非空链表中删除q节点要考虑不同的情况,大致分三类。q节点为第一个节点;q节点前驱节点已知;q节点前驱节点未知。

前两种可综合如下:

void delLink(LinkList *list,LinkList r,LinkList q){
   if(q==*list)
      *list=q->next;
   else
      r->next=q->next;
   free(q);
   
}

一种情况,需要先遍历链表找到q节点才行。

void delLink1(LinkList *list,LinkList q){
   LinkList r;
   if(q==*list){
      *list=q->next;
      free(q);
   }
   else{
      for(r=*list;r->next!=q;r=r->next);
      if(r->next!=null){
         r->next=q->next;
         free(q);
      }
   }
}

最后销毁链表:

在链表使用完后,最好销毁它,释放出其所占内存,防止内存泄露造成的麻烦。

void destroyLinkList(LinkList *list){
   LinkList p,q;
   p=*list;
   while(p){
      q=p->next;
      free(p);
      p=q;
   }
   *list=null;
}


先写到这里吧,目前觉得链表基础操作就这么些东西吧。如果有遗漏欢迎提出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值