数据结构双链表的基本运算算法

数据结构双链表的基本运算算法

#include<stdio.h>
#include<malloc.h>
typedef char ElemType;
typedef struct DNode 
{
   ElemType data;
   struct DNode * prior;
   struct DNode * next;
}DLinkList;

void InitList(DLinkList * &L)//双链表初始化 
{
   L=(DLinkList *)malloc(sizeof(DLinkList));
   L->prior=L->next=NULL;
}
void DestroyList(DLinkList * &L)// 释放空间 
{
   DLinkList *p=L,*q=p->next;
   while(q!=NULL)
  {
     free(p);
     p=q;
     q=p->next;
  }
    free(p);
}
int ListEmpty(DLinkList *L)//判断是否为空表 
{
   return(L->next==NULL);
}
int ListLength(DLinkList *L)//计算链表的长度 
{
   DLinkList *p=L;
   int i=0;
   while(p->next!=NULL)
  {
      i++;
      p=p->next;
  }
    return(i);
}
void DispList(DLinkList *L)//输出双链表 
{
   DLinkList *p=L->next;
   while(p!=NULL)
  {
    printf("%c",p->data);
    p=p->next;
  }
    printf("\n");
}
int GetElem(DLinkList *L,int i,ElemType &e)//判断是否为空表 
{
   int j=0;
   DLinkList *p=L;
   while(j<i&&p!=NULL)
  {
    j++;
    p=p->next;
  }
   if(p==NULL)
    return 0;
   else
  {
    e=p->data;
    return 1;
  }
}
int LocateElem(DLinkList *L,ElemType e)//查找元素 
{
    int n=1;
    DLinkList *p=L->next;
    while(p!=NULL && p->data!=e)
   {
      n++;
      p=p->next;
   }
    if(p==NULL)
    return 0;
   else 
     return n;
}
int ListInsert(DLinkList * &L,int i,ElemType e)//插入元素 
{
   int j=0;
   DLinkList *p=L,*s;
   while(j<i-1&&p!=NULL)
  {
    j++;
    p=p->next;
  }
   if(p==NULL)
    return 0;
   else 
  {
    s=(DLinkList *)malloc(sizeof(DLinkList));
    s->data=e;
    s->next=p->next;
    if(p->next!=NULL)p->next->prior=s;
    s->prior=p;
    p->next=s;
    return 1;
  }
}
int ListDelete(DLinkList * &L,int i,ElemType &e)//删除元素 
{
   int j=0;
   DLinkList *p=L,*q;
   while(j<i-1 && p!=NULL)
  {
     j++;
     p=p->next;
  }
   if(p==NULL)
   return 0;
   else 
  {
    q=p->next;
    if(q==NULL)
	 return 0;
    p->next=q->next;
    if(p->next!=NULL)p->next->prior=p;
    free(q);
    return 1;
  }
}


int main()
{
   DLinkList *h;
   ElemType e;
   printf("初始化双链表h\n");
   InitList(h);
   printf("依次采用尾插法插入a,b,c,d,e元素\n");
   ListInsert(h,1,'a');
   ListInsert(h,2,'b');
   ListInsert(h,3,'c');
   ListInsert(h,4,'d');
   ListInsert(h,5,'e');
   printf("输出双链表h:\n");
   DispList(h);
   printf("双链表h长度:%d\n",ListLength(h));
   printf("双链表h长度:%s\n",(ListEmpty(h)?"空":"非空"));
   GetElem(h,3,e);
   printf("双链表h的第3个元素:%c\n",e);
   printf("元素a的位置:%d\n",LocateElem(h,'a'));
   printf("在第4个元素位置上插入f元素\n");
   ListInsert(h,4,'f');
   printf("输出双链表h:\n");
   DispList(h);
   printf("删除h的第3个元素:\n");
   ListDelete(h,3,e);
   printf("输出双链表h:\n");
   DispList(h);
   printf("释放双链表h\n");
   DestroyList(h);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值