Code前端首页关于Code前端联系我们

C语言遍历单链表、插入、删除……完整实现代码

terry 2年前 (2023-09-27) 阅读数 78 #数据结构与算法

1。遍历单链表(打印、修改)

实用的概念大家一定很熟悉,就是从链表的顶部开始,一步一步向后访问每个元素,这叫遍历。对于遍历操作,我们可以衍生出很多常见的数据操作,比如查询元素、修改元素、检索元素个数、打印整个链表数据等。

遍历的思想极其简单。只需要建立一个指向链表L的节点,然后沿着链表L一一向后查找即可。 节点 *p=L-> 下一个; int i=0; ♝♝     printf(" % d个元素的值为:%d\n",++i,p->data); p=p->下一个;

对于元素修改操作,如下代码实现为:

//改变链表内容,然后将链表中修改值为x的元素改为k。 ? { 节点 *p=L->下一个; int while(p){ 如果 (p- >data==x){ p->data=k; ❀❀ p->下一个; } return L;❀只有函数需要简单的函数oid,没有参数。当我们需要进行元素修改等元素操作时,我们可以设计一个LinkedList类型的函数来返回一个新的修改后的链表。

以上操作都用到了遍历的思想。独立设计的遍历有很多用途。请参阅下面随附的练习进行练习。

2。插入操作

向链表添加节点的操作主要分为找到第i个位置并改变该位置的next指针指向我们新插入的节点,而next指针指向新插入的节点我们的 i+1 位置处的节点。操作方法可能是设置一个前驱节点,用循环找到第i个位置,然后插入。

如图,在DATA1和DATA2数据节点之间插入一个NEW_DATA数据节点:

从原来的链表状态

C语言遍历单链表,插入、删除…完整实现代码

代码实现如下:

/ /插入单向链表,插入元素int x) {No *pre; //pre为前驱节点 pre = L; int♹❀ ❀ ❀

(tempi = 1; tempi pre = 前一个>下一个; //查找第i个位置的前驱节点 } Node *p;节点为 p p = (节点 *) malloc(sizeof♼❙❙❙❙ p->data = x; p->下一个 = 上一个->下一个; 前->下一个 = p; ❀n❝ 前->下一个; }

3 . 删除操作

删除一个元素,需要创建一个前驱节点和一个当前节点,当我们找到需要删除的数据时,直接使用前驱节点跳过要删除的节点,指向待删除节点后的节点,然后将原节点通过 free 函数释放。

参考如图

C语言遍历单链表,插入、删除…完整实现代码

以下是代码实现:

//删除单链表,删除链表中值为x的元素 ❝ LinkedList LinkedListDelete(LinkedList L, int x) { de*p,*否;观点。 p = L->下一个; 同时❙(p->值 x/ind/x)与 x 元素 pre = p ;//删除操作,是继任者旁边的前任点。 免费(p); 返回❀ }

4。附:完整实现代码

# include Node { int data; struct 节点 Node *L; L = (节点 *)❀sizeof(节点)); //申请节点空间 if(L==NULL){ /❙/判断申请空间是否失败 (0) ; //失败则退出程序 ) L;

) L = (Node (Node) (节点)大小);

//复用顶部节点空间 L->next = NULL; //初始化一个空链表intx; 同时(scanf(" %d",&x) !=de p; p = (节点 *) loc (sizeof(Node)); //申请新节点 p->data = x; //节点数据字段赋值 p->下一个 = L-> 下一个; | LinkedList LinkedListCreatT() { 节点 *L; L = (节点 *)马尔 sizeof(节点)) ; //申请头节点空间 L->next = NULL; //初始化一个空链表 Node *r; r = L; //r始终指向 终端节点指向开头的头节点 int x; 同时( Scanf (%") 节点*p; p = (节点*)malloc(sizeof(节点)); //申请新节点 p->data = x; //节点数据字段赋值 r->next = p;头 L-->|1|-->|2| -->NULL r = p; } r->下一个ur; n L;}//插入单链表,插入元素int x) { 前; pre = L; int tempi = 0;❀ for (tempi = 1;tempi) 下一个; //查找i位第一个前驱 } Node *p; //插入的节点为p p = (Node *) malloc((❙)❙ p->数据= x; p->下一个 = 前->下一个; 前->下一个 = p;n L; }//删除单向链表,删除值为的元素Node *p, *pre; while(p->data != x) { //查找值为x的元素 pre = p;; } 前->下一个 = p->下一个; //删除操作,将前驱指向后继。 免费(p); 返回❀ }/ /改变链表的内容并改变链表的内容链表 值为 x 的元素变为 k。LinkedList LinkedListReplace(LinkedList L,intx,int) 节点 *p=L->下一个; i =0; while❀() if(p->data==x){ p->data==x k; }p=p->下一个;}返回节点 *p=L->下一个; int i=0; (p){ printf ( "%d 个元素值为:%d\n",++i,p->data); int main() { //创建 ♼ed列表; printf("请输入单向链表的数据:以EOF结尾\n"); list = LinkedListCreatT(); //list=链接 打印列表(列表) int x; printf(“请输入插入数据的位置:”); ​?值: "); scanf("%d",&x);

printList(list) ) ); scanf ("%d",&i) "请输入更改后的值: " ); scanf ( "%d",&x); ♼替换,i; 打印列表(列表); //删除 printf ( ); scanf( "%d",&x); LinkedListDelete(list,x); 打印 返回 0; }

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门