C/C++版数据结构之链表

时间:2023-01-07 11:31:12

本文就循环链表做一些讨论:

循环链表:

     概念:所谓循环链表,就是在单链表的基础上,把链表最后一个结点的链表指针指向链表的头结点的地址,就构成了一个循环链表。

     关键算法:

先对三个指针作下声明:

head:用来指向链表的头部。链表需要一个指针来标识,这就是头指针。

p1:用来指向新结点,以及用来遍历链表的每一个结点。

p2:用来指向当前结点。

(1)循环链表创建算法

创建一个结点数目为n的循环链表:

C/C++版数据结构之链表
#include <malloc.h>
typedef struct node { int num; struct node *next; }stud;
stud* Create(int n) { stud *head,*p1,*p2; head=p1=p2=NULL; for(int i=0;i<n;i++) { p1=(stud*)malloc(sizeof(stud)); p1->num=i; if(i==0) { head=p1; } else { p1=p->next; } p2=p1; } p2->next=head; return head; }
C/C++版数据结构之链表

 

(2)循环链表查找算法

在头指针为head的循环链表中查找i:

C/C++版数据结构之链表
typedef struct node {     int num;     struct node *next; }stud;
stud* Find(stud *head,int i) { stud *p1; p1=head;
while(p1->next!=head) { if(i==p1->num) { break; } else { p1=p1->next; } } return p1; }
C/C++版数据结构之链表

 

(3)循环链表删除算法

在头指针为head的循环链表中删除i:

C/C++版数据结构之链表
typedef struct node {     int num;     struct node *next; }stud;
bool Delete(stud *head,int i) { bool flag=false;
if(head) { stud *p1,*p2; while(p1->num!=i && p1->next!=head) { p2=p1->next; p1=p1->next; } if(p1->num==i) { if(p1==head) { head=head->next; } else { p2->next=p1->next; } free(p1); //释放已经脱离链表的结点内存 flag=true; } } return flag; }
C/C++版数据结构之链表

 

(4)循环链表插入算法

在头指针为head的循环链表中插入结点p:(假设这是一个由小到大排序的有序链表)

C/C++版数据结构之链表
stud* Insert(stud *head,stud *p) {     stud *p1,p2;     p1=head;
if(!head) { head=p; p->next=head; } else { while(p->num > p1->num && p1->next!=head) { p2=p1; p1=p1->next; } if(p->num < p1->num) { if(head==p1) { head=p; } else { p2->next=p; p->next=p1; } } else //插入末尾 { p1->next=p; p->next=head; } } return head; }
C/C++版数据结构之链表

 

 

 

诗意般生活 活出生命的精彩