双链表操作

本文详细介绍了双链表的基本操作实现,包括初始化、销毁、判断空表、获取长度、显示链表、获取指定位置元素、查找元素位置、插入元素、删除元素等。通过具体实例演示了如何使用这些操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

双链表操作
2008-08-07 01:10

#include"stdio.h"
#include"malloc.h"
//#include"algo2_3.cpp"
typedef char ElemType;
//struct DNode
// {
// ElemType data;
// struct DNode *prior;
   // struct DNode *next;
// }DLinkList;
//**********************************************************************************

typedef char ElemType;
typedef struct DNode
{
ElemType data;
struct DNode *prior;
    struct DNode *next;
}DLinkList;

void InitList(DLinkList *&L)//初始化双链表L
{
L=(DLinkList *)malloc(sizeof(DLinkList));
L->prior=L->next=NULL;
}

void DestroyList(DLinkList *&L)//释放双链表L
{
DLinkList * p=L,* q=p->next;
while(q!=NULL)
   {
   free(p);
   p=q;
   q=p->next;
   }
free(p);
}

int ListEmpty(DLinkList * L)//判断双链表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)//输出双链表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)//获取双链表L中的第i个元素
{
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)//在双链表L查元素
{
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)//在双链表L中删除第i个元素
{
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;
   }
}

//*****************************************************************************************

extern void InitList(DLinkList *&L);
extern void DestroyLList(DLinkList *&L);
extern int ListEmpty(DLinkList * L);
extern int listLength(DLinkList *L);
extern void DispList(DLinkList *L);
extern int GetElem(DLinkList * L,int i,ElemType &e);
extern int LocateElem(DLinkList *L,ElemType e);
extern int ListInsert(DLinkList *&L,int i,ElemType e);
extern int ListDelete(DLinkList *&L,int i,ElemType &e);

void main()
{
DLinkList * h;
ElemType e;
printf("1 初始化双链表H/n");
InitList(h);
printf("2 采用尾插入法输入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("3 输出双链表h: ");
DispList(h);
printf("4 双链表长度=%d/n",ListLength(h));
printf("5 双链表为%s/n",(ListEmpty(h)?"空":"非空"));
GetElem(h,3,e);
printf("6 双链表的第3个元素为%c/n",e);
printf("7 元素a的位置是%d/n",LocateElem(h,'a'));
printf("8 在第4个元素位置上插入F元素/n");
ListInsert(h,4,'f');
printf("9 输出双链表: ");
DispList(h);
printf("10 删除第3个元素/n");
ListDelete(h,3,e);
printf("11 输出双链表h: ");
DispList(h);
printf("12 释放双链表/n");
DestroyList(h);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值