其它形式連結串列總結
阿新 • • 發佈:2018-12-10
一、雙向列表
1、定義
在雙向連結串列的結點中有兩個指標域,其一指向直接後繼,另一指向直接前驅,可如下描述
//庫函式標頭檔案包含
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//函式狀態碼定義
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType; //假設線性表中的元素均為整型
typedef struct DuLNode
{
ElemType data; // 資料域
struct DuLNode *prior; // 指向前驅的指標域
struct DuLNode *next;// 指向後繼的指標域
}DuLNode,*DuLinkList;
二、 迴圈連結串列
1、定義
迴圈連結串列是另一種形式的鏈式儲存結構。它的特點是表中最後一個結點的指標域指向頭結點,整個連結串列形成一個環由此,從表中任一結點出發均可找到表中其他結點。
2、迴圈連結串列的操作和線性連結串列基本一致,差別僅在於演算法中的迴圈條件不是p或p->next是否為空,而是它們是否等於頭指標
三、雙向迴圈連結串列
1、
2、在雙向連結串列中,有些操作如:ListLength、GetElem和LocateElem等僅需涉及一個方向的指標,則它們的演算法描述和線性連結串列的操作相同,但是在插入和刪除時有很大的不同,在雙向連結串列中需同時修改兩個方向上的指標。
3、雙向連結串列插入資料
Status ListInsert_DuL(DuLinkList& L,int i,ElemType e)//在第i個位置處插入e元素
{
DuLinkList s;
DuLinkList p=L;
int j=0;
while(p->next!= L&&j<i-1)
{
p=p->next;
j++;
}
if(p->next==L||j>i-1) return ERROR;
s=(DuLinkList)malloc(sizeof(Node));
scanf("%d",&s->data);
s->next=p->next;p->next=s;
s->next->prior=s;//新加
s->prior=p;//新加
return OK;
}
注意: (1)與單向列表不同的地方是
s->next = p->next; p->next = s;
s->next->prior = s; s->prior = p;
4、雙向連結串列刪除資料
Status ListDelete_DuL(DuLinkList& L,int i,ElemType e)//刪除第i個位置處的元素
{
DuLinkList s,p=L;
int j=0;
while(p->next!=L&&j<i-1)
{
p=p->next;
j++;
}
if(p->next==L||j>i-1) return ERROR;
s=p->next;
e=p->next->data;
p->next=p->next->next;
p->next->prior = p;//新加
free(s);
return OK;
}