一口气搞懂「链表」,就靠这20+张图了( 五 )


其代码如下:
  typedef struct list{
int data;
struct list *next;
}list;
//data为存储的数据,next指针为指向下一个结点
 
循环单链表初始化先创建一个头结点并且给其开辟内存空间,在开辟内存空间成功之后,将头结点的next指向head自身,创建一个init函数来完成;
为了重复创建和插入,我们可以在init函数重新创建的结点next指向空,而在主函数调用创建之后,将head头结点的next指针指向自身 。
这样的操作方式可以方便过后的创建单链表,直接利用多次调用的插入函数即可完成整体创建 。
其代码如下:
  //初始结点
list *initlist{
list *head=(list*)malloc(sizeof(list));
if(head==){
printf("创建失败,退出程序");
exit(0);
}else{
head->next=;
return head;
}
}
在主函数重调用可以是这样:
  //////////初始化头结点//////////////
list *head=initlist;
head->next=head;
 
循环链表的创建操作如图所示:

一口气搞懂「链表」,就靠这20+张图了

文章插图
单向循环链表的创建
通过逐步的插入操作,创建一个新的节点,将原有链表尾结点的next指针修改指向到新的结点,新的结点的next指针再重新指向头部结点,然后逐步进行这样的插入操作,最终完成整个单项循环链表的创建 。
其代码如下:
  //创建——插入数据
int insert_list(list *head){
int data; //插入的数据类型
printf("请输入要插入的元素:");
scanf("%d",&data);
list *node=initlist;
node->data=https://www.isolves.com/it/cxkf/bk/2020-08-31/data;
//初始化一个新的结点,准备进行链接
if(head!=){
list *p=head;
//找到最后一个数据
while(p->next!=head){
p=p->next;
}
p->next=node;
node->next=head;
return 1;
}else{
printf("头结点已无元素n");
return 0;
}
}
 
循环单链表的插入操作如图,对于插入数据的操作,可以创建一个独立的结点,通过将需要插入的结点的上一个结点的next指针指向该节点,再由需要插入的结点的next指针指向下一个结点的方式完成插入操作 。
一口气搞懂「链表」,就靠这20+张图了

文章插图
其代码如下:
  //插入元素
list *insert_list(list *head,int pos,int data){
//三个参数分别是链表,位置,参数
list *node=initlist; //新建结点
list *p=head; //p表示新的链表
list *t;
t=p;
node->data=https://www.isolves.com/it/cxkf/bk/2020-08-31/data;
if(head!=){
for(int i=1;i<pos;i++){
t=t->next; //走到需要插入的位置处
}
node->next=t->next;
t->next=node;
return p;
}
return p;
}
 
循环单链表的删除操作如下图所示,循环单链表的删除操作是先找到需要删除的结点,将其前一个结点的next指针直接指向删除结点的下一个结点即可 。
需要注意的是尾结点,因为删除尾节点后,尾节点前一个结点就成了新的尾节点,这个新的尾节点需要指向的是头结点而不是空 。
一口气搞懂「链表」,就靠这20+张图了

文章插图
其代码如下:
  //删除元素
int delete_list(list *head) {
if(head == ) {
printf("链表为空!n");
return 0;
}
//建立临时结点存储头结点信息(目的为了找到退出点)
//如果不这么建立的化需要使用一个数据进行计数标记,计数达到链表长度时自动退出
//循环链表当找到最后一个元素的时候会自动指向头元素,这是我们不想让他发生的
list *temp = head;
list *ptr = head->next;
int del;
printf("请输入你要删除的元素:");
scanf("%d",&del);
while(ptr != head) {
if(ptr->data =https://www.isolves.com/it/cxkf/bk/2020-08-31/= del) {
if(ptr->next == head) {
temp->next = head;
free(ptr);
return 1;
}
temp->next = ptr->next; //核心删除操作代码
free(ptr);
//printf("元素删除成功!n");
return 1;
}
temp = temp->next;
ptr = ptr->next;
}
printf("没有找到要删除的元素n");
return 0;


推荐阅读