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