当前位置:文档之家› 循环双向链表

循环双向链表

#include <stdio.h>#include "Dlink.h"int main(void){DLink *L;int i = 0;ElemType e = '0';//认真体会C语言拷贝传递的思想InitList(&L);InsElem(L, 'a', 1);InsElem(L, 'b', 2);InsElem(L, 'c', 3);InsElem(L, 'd', 4);InsElem(L, 'e', 5);printf("线性表");DispList(L);printf("长度:%d/n",GetLength(L));i = 3;GetElem(L, i, &e);printf("第%d个元素:%c/n", i, e);e = 'a';printf("元素%c是第%d个元素/n", e, Locate(L, e));i = 4;printf("删除第%d个元素/n", i);DelElem(L, i);printf("线性表:");DispList(L);/**/return 0;}[cpp] view plaincopyprint?#ifndef DLINK#define DLINKtypedef char ElemType;typedef struct node{ElemType data;struct node *prior, *next;}DLink;void InitList(DLink **L); //初始化运算int GetLength(DLink *L); //求表长运算int GetElem(DLink *L, int num, ElemType *e); //求线性表中第i个元素运算int Locate(DLink *L, ElemType x); //按值查找运算int InsElem(DLink *L, ElemType x, int i); //插入节电运算int DelElem(DLink *L, int num); //删除结点运算void DispList(DLink *L); //输出线性表#endif[cpp] view plaincopyprint?#include <stdio.h>#include "Dlink.h"#include <malloc.h>/************************************************** 函数名:void InitList(DLink **L)** 功能:初始化线性表运算** 描述:无** 作者:/***/*************************************************/void InitList(DLink **L){*L = (DLink *)malloc(sizeof(DLink));(*L)->prior = (*L)->next = *L;}/************************************************** 函数名:int getLength(DLink *L)** 功能:获取链表的长度** 描述:无** 作者:/***/*************************************************/int GetLength(DLink *L)int i = 0;DLink *p = L->next;while(p != L){i++;p = p->next;}return i;}/************************************************ ** 函数名:int GetElem(DLink *L, int num, ElemType *e) ** 功能:求线性表中第i个元素运算** 描述:出错返回-1,成功返回0** 作者:/***/*************************************************/int GetElem(DLink *L, int num, char *e){int j = 1;DLink *p = L->next;if(num < 1 || num > GetLength(L)){return -1;}while(j < num){p = p->next;j++;}*e =p->data;return 0;}/************************************************ ** 函数名:int Locate(DLink *L, ElemType x)** 功能:求某元素在线性表中的位置** 描述:出错返回-1,成功返回位于线性表第几个元素** 作者:/***/*************************************************/int Locate(DLink *L, ElemType x){DLink *p = L->next;int i = 1; //起始位置1//while(i < GetLength(L) && p->data != x)while(p != L && p->data != x){p = p->next;i++;}if(p == L){return -1;}else{return i;}}/************************************************** 函数名:int InsElem(DLink *L, ElemType x, int num)** 功能:在线性表某个位置插入某元素** 描述:出错返回-1** 作者:/***/*************************************************/int InsElem(DLink *L, ElemType x, int num){DLink *p = L,*s;//s = (DLink *)malloc(sizeof(DLink));int j = 1;s = (DLink *)malloc(sizeof(DLink)); //这句必须放在int j = 1;定义的后面,VC6使用的非C99标准,定义必须放前面if(num < 1 || num > GetLength(L) + 1) //注意考虑可以插入在最后一位,所以是GetLength(L)+1{free(s);return -1;}s->data = x;while(j < num) //指向待插入位置前一个结点{p = p->next;j++;}s->next = p->next;s->next->prior = s;s->prior = p;p->next = s;return 0;}/************************************************ ** 函数名:int DelElem(DLink *L, int num)** 功能:删除线性表某位置的元素** 描述:出错返回-1** 作者:/***/*************************************************/int DelElem(DLink *L, int num){DLink *p = L, *q;int j = 1;if(num < 1 || num > GetLength(L)){return -1;}while(j < num) //指向待删除元素的前一个结点{p = p->next;j++;}q = p->next; //指向待删除元素q->next->prior = p;p->next = q->next;free(q);return 0;}/************************************************ ** 函数名:void DispList(DLink *L)** 功能:输出线性表** 描述:无** 作者:/***/*************************************************/void DispList(DLink *L){DLink *p = L->next;while(p != L){printf("%c ",p->data);p = p->next;}printf("/n");}。

相关主题