快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

新蒲京澳门赌场网站:链表的C语言实现之循环链表及双向链表



一、轮回链表

轮回链表是与单链表一样,是一种链式的存储布局,所不合的是,轮回链表的着末一个结点的指针是指向该轮回链表的第一个结点或者表头结点,从而构成一个环形的链。

轮回链表的运算与单链表的运算基础同等。所不合的有以下几点:

1、在建立一个轮回链表时,必须使其着末一个结点的指针指向表头结点,而不是象单链表那样置为NULL。此种环境还应用于在着末一个结点后插入一个新的结点新蒲京澳门赌场网站。

2、在判断是否到表尾时,是判断该结点链域的值是否是表头结点,当链域值即是表头指针时,阐明已到表尾。而非象单链表那样判断链域值是否为NULL。

二、双向链表

双向链表着实是单链表的改进。

当我们对单链表进行操作时,无意偶尔你要对某个结点的直接先驱进行操作时,又必须从表头开始查找。这是由单链表结点的布局所限定的。由于单链表每个结点只有一个存储直接后继结点地址的链域,那么能不能定义一个既有存储直接后继结点地址的链域,又有存储直接先驱结点地址的链域的这样一个双链域结点布局呢?这便是双向链表。

在双向链表中,结点除含稀有据新蒲京澳门赌场网站域外,还有两个链域,一个存储直接后继结点地址,一样平常称之为右链域;一个存储直接先驱结点地址,一样平常称之为左链域。在c说话中双向链表结点类型可以定义为:

typedef struct node

{

int data; /*数据域*/

struct node *llink,*rlink; /*链域,*llink是左链域指针,*rlink是右链域指针*/

}JD;

当然,也可以把一个双向链表构建成一个双向轮回链表。

双向链表与单向链表一样,也有三种基础运算:查找、插入和删除。

双向链表的基础运算:

1、查找

假若我们要在一个带表头的双向轮回链表中查找数据域为一特定值的某个结点时,我们同样从表头结点以后依次对照各结点数据域的值,若恰是该特定值,则返回指向结点的指针,否则继承以后查,直到表尾。

下例便是利用双向轮回链表查找算法的一个法度榜样。

#include <stdio.h>

#include <malloc.h>

#define N 10

typedef struct node

{

char name[20];

struct node *llink,*rlink;

}stud;

stud * creat(int n)

{

stud *p,*h,*s;

int i;

if((h=(stud *)malloc(sizeof(stud)))==NULL)

{

printf("不能分配内存空间!");

exit(0);

}

h->name[0]=’\0’;

h->llink=NULL;

h->rlink=NULL;

p=h;

for(i=0;i<n;i++)

{

if((s= (stud *) malloc(sizeof(stud)))==NULL)

{

printf("不能分配内存空间!");

exit(0);

}

p->rlink=s;

printf("请输入第%d小我的姓名",i+1);

scanf("%s",s->name);

s->llink=p;

s->rlink=NULL;

p=s;

}

h->llink=s;

p->rlink=h;

return(h);

}

stud * search(stud *h,char *x)

{

stud *p;

char新蒲京澳门赌场网站 *y;

p=h->rlink;

while(p!=h)

{

y=p->name;

if(strcmp(y,x)==0)

return(p);

else p=p->rlink;

}

printf("没有查找到该数据!");

}

void print(stud *h)

{

int n;

stud *p;

p=h->rlink;

printf("数据信息为:\n");

while(p!=h)

{

printf("%s ",&*(p->name));

p=p->rlink;

}

printf("\n");

}

main()

{

int number;

char 新蒲京澳门赌场网站studname[20];

stud *head,*searchpoint;

number=N;

clrscr();

head=creat(number);

print(head);

printf("请输入你要查找的人的姓名:");

scanf("%s",studname);

searchpoint=search(head,studname);

printf("你所要查找的人的姓名是:%s",*&searchpoint->name);

}  2、插入

删除某个结点,着实便是插入某个结点的逆操作。照样对付双向轮回链表,要在继续的三个结点s,p,q中删除p结点,只需把s的右链域指针指向q,q的左链域指针指向s,并收回p结点就完成了。

下面便是一个利用双向轮回链表删除算法的例子:

#include

#include

#include

#define N 10

typedef struct node

{

char name[20];

struct node *llink,*rlink;

}stud;

stud * creat(int n)

{

stud *p,*h,*s;

int i;

if((h=(stud *)malloc(sizeof(stud)))==NULL)

{

printf("不能分配内存空间!");

exit(0);

}

h->name[0]=’\0’;

h->llink=NULL;

h->rlink=NULL;

p=h;

for(i=0;i〈n;i++)

{

if((s= (stud *) malloc(sizeof(stud)))==NULL)

{

printf("不能分配内存空间!");

exit(0);

}

p-〉rlink=s;

printf("请输入第%d小我的姓名",i+1);

scanf("%s",s->name);

s->llink=p;

s->rlink=NULL;

p=s;

}

h->llink=s;

p->rlink=h;

return(h);

}

stud * search(stud *h,char *x)

{

stud *p;

char *y;

p=h->rlink;

while(p!=h)

{

y=p->name;

if(strcmp(y,x)==0)

return(p);

else p=p->rlink;

}

printf("没有查找到该数据!");

}

void print(stud *h)

{

int n;

stud *p;

p=h->rlink;

printf("数据信息为:\n");

while(p!=h)

{

printf("%s ",&*(p->name));

p=p->rlink;

}

printf("\n");

}

void del(stud *p)

{

(p->rlink)->llink=p->llink;

(p->llink)->rlink=p->rlink;

free (p);

}

main()

{

int number;

char studname[20];

stud *head,*searchpoint;

number=N;

clrscr();

head=creat(number);

print(head);

printf("请输入新蒲京澳门赌场网站你要查找的人的姓名:");

scanf("%s",studname);

searchpoint=search(head,studname);

printf("你所要查找的人的姓名是:%s\n",*&searchpoint->name);

del(searchpoint);

print(head);

}

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: