1. 程式人生 > >其它形式連結串列總結

其它形式連結串列總結

一、雙向列表 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;
}