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

(双向)循环链表基本功能:增删改查及C语言代码实现

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

添加数据的功能与单向链表添加信息的功能基本相同。我们可以通过添加所需的Node来创建一个独立的节点,前一个节点的next指针指向该节点,然后将要添加的节点的next指针指向下一个节点,结束添加操作。

(双向)循环链表的基本操作:插入、删除、遍历及C语言代码实现

代码可表达如下:

//插入元素 list *insert_list(list *head,int〹❀ ♼♼data ; list * p=head; node->data=data; if(head!=NULL){❂♂ 
( int i=1;i下一个 } 节点->下一个=t->下一个;t->下一个=节点;返回p; }

2.循环单链表删除功能

如图所示,循环单链表删除函数可以参考链表删除函数,即找到要删除的节点,将前一个节点的next指针改为直接指向下一个节点被删除的节点,但是需要注意尾节点和头节点的特殊考虑,尤其是尾节点,因为尾节点删除后尾节点之前的节点就变成了一个新节点尾节点这个新的尾节点节点必须指向头节点而不是空。关键节点可以存储为[当前上一个节点.next=自身节点.next]。该程序可以保存头节点和尾节点。特别声明:

(双向)循环链表的基本操作:插入、删除、遍历及C语言代码实现

代码可表示为:

//删除元素 int *♶ if (head == NULL) { printf("字符串桌子是空的! \n");' } //创建临时节点,用于存储主节点的数据(目的是为了找到退出点) //如果不是这样形成transform,就得用data来标记计数字符,当计数器到达链表时会自动清零 //当循环链表最后一个元素时发现自动指向我们不希望发生的 head 元素 list * temp = head ; int del; printfprintf:P 要删除 );   scanf ("%d" ,&del); ,&del); jos (ptr-> data == del) { > next = ptr-> next; //取芯函数代码 free(ptr); 1;   }

->t; ptr = ptr->下一个;

} printf("没有找到要删除的元素\n"); 返回0; }

3。循环单链表

的遍历与常规单链表和双向链表的遍历不同。循环链表需要特别考虑节点来找到尾节点的位置。因为尾节点的next指针指向头节点,所以我们不能用链表本身是否为空(NULL)的方法来进行简单的循环判断。我们需要评估节点的下一个指针是否等于父节点才能完成循环。结论

另外,还有一种计算方法,定义计数器count=0。每次下一个指针指向下一个节点时,计数器都会加一。当计数等于链表中的节点数时,循环完成。这里就有问题了,就是要得到链表的节点数,还需要做一次遍历才能达到目的。

代码可表达如下:

//元素遍历 int display(list*head) {❀♷ (head != NULL ) { list *p = head; //循环头节点到最后一条数据 != head ) { Printf ( "%d" , P-> 下一步-> 数据); P = P-> 下一步; }} | † 1;    }  其他♹ { printf("标题节点为空!\n"); }}

4。进阶概念——双向循环链表

还有一个循环链表的进阶概念练习。就像双向链表和单链表的关系一样,循环单链表也有一个孪生兄弟——双向循环链表。其设计思想与单链表和双向链表相同,即在原有双链表的基础上,尾节点和头节点相互连接。设计这个链表并不困难,留给读者自己做。设计。

5。循环单独链接列表代码

#include#includetypedeftypedef 列表{ int data; struct❀t }list;//data为存储的数据,next指针指向下一个节点 // 起始节点 list*head list () {list*head = (list*) malloc (❀malloc () size exit (0); head->next=NULL; 返回返回
}} //创建--插入数据intcreate_list(列表*头){数据;//新增数据类型 printf() Enter要添加的元素: " ); scanf("%d",&data); list *node=initlist(); node->♹ ❀data ; //初始化一个新节点,准备链接 if(head!=NULL){ list *p=head; /          ❙♺t;下一个!=头){        p=p->下一个;下一个=节点;>1; {         printf("head节点没有元素"); return

int data){ //三个参数分别是链表、位置和参数 list *node=initlist(); //新建节点 list *p=head; † if(main!=NULL){ for(int=i+i)+我+我;         t=t->下一个; } 节点->下一个=t->下一个; t->下一个=节点; p;} 返回 //删除元素 int delete_list( list *head ) { if ​​(head == NULL) {printf("链表为空!\n"); 0; } //创建零时间节点,用于存储主节点的数据(目的是寻找退出点) ❀❃♶❀ /如果变换如果不是这样形成的,则必须使用数据进行计算和标记,当计数器达到链表长度时自动移除 //循环链表在以下情况下自动指向父元素找到最后一个元素。这不是我们想要发生的事情 list *temp = head; † printf("输入要删除的元素:" );            scanf("%d “,&del); r != head) { if(ptr->data == del) { heat->next = head; 免费 ( ptr); * } temp->next = ptr->next;

tr);️ ​//printf("元素删除成功!\n" ) ;                                                                                    temp = temp->下一个; ptr = ptr->下一个; } printfprintf(() ) 找到\n") ; 返回 0;}}} 显示(列表*头){(头!= NULL) { list *p = head; //移动头节点//将头节点移动到最后一个数据,当时(p-> next != head ){                                                                                   p = p->下一个; 正常换行符 (o= ^•ェ•)o  | } › ("头节点为空!\n ");    返回0;>intmain(){  //// /// /初始化头节点/// // /// //// list *head=initlist(); head->next; †  i =0;i

版权声明

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

热门