news 2026/9/2 11:46:04

单链表和循环链表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
单链表和循环链表

单链表:

(构建一个结构体,里面包含data用于储存每个节点的数据,还要包含一个用于指向下一个结点的指针*next)

typedef struct node//typedef 用于起别名

{

int data;

struct node *next;

}Node;//Node是typedef给结构体起的别名,用于让编译器识别,Node是结构体类型

建立一个单链表所需的一系列操作函数:

1.初始化头结点:head->next=NULL;

2.头插法,将后面的每个数据从头结点后面插入

3.尾接法,将待插入的数据往末尾插入这两种方法都是用来插入数据,顺序不一样

4.开辟内存空间:具体怎么实现以上插入数据操作,这就要靠开辟内存空间来实现了,每插入一个数据,都要开辟一个内存空间(结点)来存放数据,再将它用头插法或尾接法插入链表

5.删除操作函数:参数部分得包括头结点(用于找到target)和target

.......

代码如下:

#include<stdio.h> #include<stdlib.h> typedef struct node { int data; struct node *next; }Node; //头插法 Node *insert(Node *head,int e) { Node *L=(Node *)malloc(sizeof(Node)); L->data=e; if(head->next==NULL) { head->next=L; L->next=NULL; } else{ L->next=head->next; head->next=L; } return head; } //去尾巴 Node *deletnode(Node *head) { Node *tail=head; if(tail->next==NULL) return head; while(tail->next!=NULL) { tail=tail->next; } Node *p=head; while(p->next!=tail) { p=p->next; } free(tail); p->next=NULL; return head; } //遍历匹配 int compare(Node *head,int e) { Node *p=head->next; while(p!=NULL) { if(p->data==e) { return 1;//有相同的 break; } p=p->next; } return -1;//没有相同的 } //计数 int count(Node *head) { int sum=0; Node *p=head; while(p->next!=NULL) { sum++; p=p->next; } return sum; } int main() { int M,N; scanf("%d %d",&M,&N); int i=0,j=0; int arr[N]; for(i=0;i<N;i++) scanf("%d",&arr[i]); Node *head=(Node *)malloc(sizeof(Node)); head->next=NULL; head->data=0; int k=-1,sum=0; while(N--) { k++; int len=count(head); if(compare(head,arr[k])==1) continue; else { if(len>=M) head=deletnode(head); sum++; } head=insert(head,arr[k]); } printf("%d\n",sum); return 0; }

循环链表:

在单链表的基础上将尾结点连接至头结点上去

函数操作和单链表的一系列操作一样

代码如下:

#include<stdio.h> #include<stdlib.h> typedef struct node { int data; struct node*next; }Node; //头插法,用来初始化,将数据放进去 Node *insert(Node *head,int e) { Node *L=(Node *)malloc(sizeof(Node)); L->data=e; if(head->next==head) { head->next=L; L->next=head; } else { L->next=head->next; head->next=L; } return head; } //删除数据 Node *deletnode(Node *head,Node *pre,Node *target) { pre->next=target->next; free(target); return head; } //打印函数 void print(Node *head) { if(head->next==head) { printf("链表为空\n"); return; } else { Node *p=head->next; while(p->next!=head) { printf("%d ",p->data); p=p->next; } printf("%d",p->data); } } int main() { //给链表初始化 Node *head=(Node *)malloc(sizeof(Node)); if(head==NULL) { printf("内存分配失败\n"); return 1; } head->next=head; head->data=0; //将1-10给放进去 for(int i=10;i>=1;i--) { head=insert(head,i); } int N; scanf("%d",&N); while(N--) { int m; scanf("%d",&m); Node *target=head; while(target->next!=head) { if(target->data==m) break; target=target->next; } Node *pre=head; while(pre->next!=head) { if(pre->next->data==m) break; pre=pre->next; } head=deletnode(head,pre,target); //将删除的元素放入最前端 head=insert(head,m); print(head); printf("\n"); } return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 21:52:34

终极视觉革命:Photon光影包让你的Minecraft世界焕然一新

终极视觉革命&#xff1a;Photon光影包让你的Minecraft世界焕然一新 【免费下载链接】photon A shader pack for Minecraft: Java Edition 项目地址: https://gitcode.com/gh_mirrors/photon3/photon 想要彻底改变你对Minecraft的视觉认知吗&#xff1f;Photon光影包正是…

作者头像 李华
网站建设 2026/9/2 21:52:41

头发边缘抠得准不准?BSHM细节处理解析

头发边缘抠得准不准&#xff1f;BSHM细节处理解析 人像抠图技术在近年来发展迅速&#xff0c;尤其是在电商、摄影后期、虚拟背景等场景中&#xff0c;精准的前景提取能力变得越来越重要。但真正考验一个抠图模型实力的&#xff0c;往往不是整体轮廓&#xff0c;而是那些细如发…

作者头像 李华
网站建设 2026/9/2 12:31:17

百度网盘文件秒传高效秘籍:轻松实现快速转存

百度网盘文件秒传高效秘籍&#xff1a;轻松实现快速转存 【免费下载链接】baidupan-rapidupload 百度网盘秒传链接转存/生成/转换 网页工具 (全平台可用) 项目地址: https://gitcode.com/gh_mirrors/bai/baidupan-rapidupload 还在为百度网盘大文件传输效率低而烦恼吗&a…

作者头像 李华
网站建设 2026/9/2 6:43:30

小白也能懂:用Whisper-large-v3实现语音转文字全攻略

小白也能懂&#xff1a;用Whisper-large-v3实现语音转文字全攻略 你有没有遇到过这样的情况&#xff1a;会议录音听了一遍又一遍&#xff0c;还是漏掉关键信息&#xff1f;外语视频看得吃力&#xff0c;字幕跟不上节奏&#xff1f;或者只是想把一段语音快速变成文字稿&#xf…

作者头像 李华