循环双链表
#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");
}