单向循环链表

来源:互联网 发布:最优化 教材 编辑:程序博客网 时间:2024/05/01 15:51

循环链表:

   单链表只能找到后继结点,无法找到前驱结点。如果不从头结点出发 ,就无法访问到全部及诶单,为了解决这个问题,循环链表被提出。将单链表终端结点的空指针改为指向头结点,使整个链表形成一个环,这种头尾相接的单循环链表,简称为循环链表。

并不是循环链表一定要有头结点,只不过为了使空链表(rear == rear->next)与非空链表处理一致,通常会设置一个头结点。


以下为相关程序:

/* 1.循环链表存储结构代码 */

/* 2.初始循环链表 */

/* 3.循环链表长度 */

/* 4.循环链表插入 */

/* 5.循环链表查找 */

/* 6.循环链表删除 */

/* 7.遍历循环链表 */

/* 8.循环链表组合 */

#include<stdio.h>#include<stdlib.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 20 /* 存储空间初始分配量 */typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */typedef char ElemType;/* ElemType类型根据实际情况而定,这里假设为char *//* 1.循环链表存储结构代码 */typedef struct Node{ElemType  data;struct Node *next;}Node,*CircleList;  /* 2.初始循环链表 */Status InitList(CircleList *L) { *L = (CircleList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */ if(!(*L))   /* 存储分配失败 */ return ERROR; (*L)->next = *L;   return OK;}/* 3.循环链表长度 */int LengthList(CircleList L){int i=0;    CircleList head = L,p=L->next; /* head 指向头结点,p指向第一个结点 */    while(p && p!=head)                            {        i++;        p=p->next;    }    return i;}/* 4.循环链表插入 */Status ListInsert(CircleList *L,int i,ElemType e){int j;CircleList p,s;p = *L;j = 1;if( i<1 || i>LengthList(*L)+1)return ERROR;while( j < i)  /*寻找第i-1个结点,不能为空 */{p = p->next;++j;}s = (CircleList)malloc(sizeof(Node));s->data = e;s->next = p->next;p->next = s;return OK;}/* 5.循环链表查找 */Status GetElem(CircleList L,int i,ElemType *e){int j;CircleList p;p = L->next; /* L是头指针,指针p指向链表的第一个结点 */j = 1;if( i<1 || i>LengthList(L))return ERROR;while (j < i){p = p->next;++j;}*e = p->data;return OK;}/* 6.循环链表删除 */Status ListDelete(CircleList *L,int i,ElemType *e){int j;CircleList p,q;p = *L;j = 1;if( i<1 || i>LengthList(*L))return ERROR;while( j < i) /* 寻找第i-1个结点,下一结点不能为空 */{p = p->next;++j;}q = p->next;p->next = q->next;*e = q->data;free(q);return OK;}/* 7.遍历循环链表 */Status ListTraverse(CircleList L){    CircleList head = L,p=L->next;while(p != head)    {        printf("%c  ",(p->data) );        p=p->next;    }    printf("\n");    return OK;}/* 8.循环链表组合 */Status  GroupList(CircleList *L1,CircleList *L2){    CircleList head1 = *L1,p1;CircleList head2 = *L2,p2;p1 = *L1;p2 = *L2;while(p1->next != head1)    {        p1=p1->next;    }while(p2->next != head2)    {        p2=p2->next;    }p1->next = (*L2)->next;p2->next = *L1;    return OK;}int main(){CircleList L,L2;ElemType e,f;int i;InitList(&L);printf("初始化后:L.length= %d  \n",LengthList(L));for(i=0;i<10;i++)ListInsert(&L,1,65+i);ListTraverse(L);GetElem(L,i-2,&e);printf("第 %d  个元素: %c  \n",i-2,e);ListDelete(&L,i-7,&f);printf("删除第 %d  个元素: %c 后 : ",i-7,f);ListTraverse(L);InitList(&L2);for(i=0;i<5;i++)ListInsert(&L2,1,'a'+i);printf("L2的元素为: ");ListTraverse(L2);GroupList(&L,&L2);printf("L2的元素与L1组合: ");ListTraverse(L);return 0 ;}



0 0
原创粉丝点击