循环双链表

 

#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 DLINK

typedef 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");
}



posted @ 2010-10-27 07:33  云说风轻  阅读(344)  评论(0编辑  收藏  举报