单向循环链表
来源:互联网 发布:最优化 教材 编辑:程序博客网 时间: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
- 单向循环链表
- 单向循环链表
- 单向循环链表
- 单向循环链表
- 循环单向链表
- 单向循环链表
- 循环单向链表
- 单向链表循环
- 循环单向链表
- 单向循环链表
- 单向循环链表
- 单向循环链表
- 单向循环链表
- 单向循环链表
- 单向循环链表
- 单向循环链表反转
- 单向循环链表C++
- 单向不循环链表
- Hadoop学习笔记---MapReduce
- sleep和wait的区别
- 根据两点经纬度计算距离http://www.cnblogs.com/ycsfwhh/archive/2010/12/20/1911232.html
- Linux操作系统下Flash插件安装设置方法
- “道可道,非常道”——千年孤独话老子
- 单向循环链表
- timeGetTime() 时间误差问题
- JAVA UUID 生成
- android Monkey test测试
- The connection to adb is down, and a severe error has occured.
- 图的拓扑排序—递归—迭代
- Android Settings 修改
- Win7 无法访问局域网内其他电脑以及共享的文件解决办法,以下错误代码:0x80004005解决办法
- 一步一步在Linux上升级10gR2 RAC到11gR2 RAC(2)