您的位置:首页 > 理论基础 > 数据结构算法

基本数据结构----双链表

2013-05-08 14:54 501 查看
  双链表也叫双向链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

1:基本结构

  双向链表中有两种不同方向的链,即每个节点中除了next域存放后继结点地址外,还增加一个指向其弯曲的指针prior。



其中头指针head是唯一确定的。如果将头结点和尾节点连接起来就成了双向循环链表。

2: 双向循环链表的节点删除

在双循环链表中删除某一个节点步骤如下



3:插入操作





代码:

#include<iostream>
#include<malloc.h>
using namespace std;
typedef char ElemType;
typedef struct DNode
{
ElemType data;
struct DNode *pre;
struct DNode *next;
}DLinkList;
void InitList(DLinkList *&L)
{
L = (DLinkList *)malloc(sizeof(DLinkList));
L->pre = NULL;
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 DisplayList(DLinkList *L)
{
DLinkList *p = L->next;
while(p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
int GetElem(DLinkList *L,int i,ElemType &e)   //得到第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)        //确定元素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 *) new DLinkList;  //s = (DLinkList *)malloc(sizeof(DLinkList));
s->data = e;
s->next = p->next;
if(p->next != NULL)
{
p->next->pre = s;
}
p->pre = 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->pre=p;
free(q);
return 1;
}
}
int main()
{
DLinkList *L;
ElemType e;
cout << " (1):初始化双链表L:\n ";
InitList(L);
cout << "(2):依次采用插入法插入元素abcde\n";
ListInsert(L,1,'a');
ListInsert(L,2,'b');
ListInsert(L,3,'c');
ListInsert(L,4,'d');
ListInsert(L,5,'e');
cout << " (3)输出双链表L: ";
DisplayList(L);
cout << " (4)双链表的长度:";
cout << ListLength(L) << endl;
cout << " (5)双链表为:  " << (ListEmpty(L)?"空":"非空");
GetElem(L,3,e);
cout << " (6)双链表第3个元素为:" << e << endl;
cout << " (7)元素a的位置是: " << LocateElem(L,'a') <<endl;
cout << " (8)在第四个位置上插入元素f";
ListInsert(L,4,'f');
cout << " (9)输出双链表L";
DisplayList(L);
cout << " (10)删除第三个元素:\n";
ListDelete(L,3,e);
cout << " (11)输出双链表L: ";
DisplayList(L);
cout << " (12)释放双链表L:";
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: