C/C++版数据结构之链表<二>

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

循环链表:

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

     关键算法:

先对三个指针作下声明:

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

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

p2:用来指向当前结点。

(1)循环链表创建算法

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

#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;
}

 

(2)循环链表查找算法

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

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;
}

 

(3)循环链表删除算法

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

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;
}

 

(4)循环链表插入算法

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

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++版数据结构之链表<一>

  •  C/C++版数据结构之链表<二>

  •  C/C++版数据结构之链表<三>

 

 

原文链接: https://www.cnblogs.com/danshui/archive/2011/12/29/2306668.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C/C++版数据结构之链表<二>

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/39371

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 下午4:01
下一篇 2023年2月8日 下午4:01

相关推荐