雙向循環鏈表 初始化 插入 刪除


#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE -1
#define NULL 0
#define OVERFLOW -2
#define ElemType int
#define Status int
typedef int ElemType
typedef int Status
#define LEN sizeof(DuLNode)
#define MLC (LinkList)malloc(sizeof(DuLNode))
/*
//線性表的基本操作列表
InitList(&L) //初始化線性表L
DestroyList(&L) //銷毀線性表L
ClearList(&L) //清空線性表L
ListEmpty(L) //判斷線性表是否為空
ListLength(L) //求線性表L的長度
GetElem(L,i,&e) //取線性表L的第i個元素
LocateElem(L,e,compare()) //定位檢索線性表L中元素e
compare() //比較兩個元素的大小,返回Bool
compareArray() //比較兩個數組的大小,返回Bool
PriorElem(L,cur_e,&prio_e) //返回線性表L中元素e的直接前驅元素
NextElem(L,cur_e,&next_e) //返回線性表L中元素e的直接后繼元素
ListInsert(&L,i,e) //在線性表L的第i個元素之前插入元素e,返回Bool
ListDelete(&L,i,e) //刪除線性表L的第i個元素,被刪除元素e的值,返回Bool
ListTraverse(L,visit()) //遍歷線性表:依次對L的每個元素調用visit()
visit() //  visit 一般是指樹型鏈表結構中對某個節點內容進行訪問的函數,
//    就是取出節點內容去做某一件事,通常算法中不寫出具體函數內容。
//  樹型鏈表結構中自頂開始按照某種順序順藤摸瓜至某個節點的過程稱為“遍歷”
*/
//-------雙向循環鏈表--------------
//雙向循環鏈表 初始化 插入 刪除
typedef struct DuLNode { //封裝 雙向鏈表
    ElemType data;
    struct DuLNode *prior;//前驅
    struct DuLNode *next;//后繼
}DuLNode, *DuLinkList;

//初始化 雙向循環鏈表 函數自己產生指針 產生一個頭結點
DuLinkList DuLinkListInit_Out_Ptr() {
    DuLinkList L = (LinkList)malloc(LEN);
    if (L == NULL)       //判斷是否有足夠的內存空間 
        exit(OVERFLOW);
    L->next = L;  //next指向自己
    L->prior = L; //prior指向自己
    return L;
}
Status ListInsert_Dul_Tail_Tan(DuLinkList &L, int i, ElemType e) {
    //在帶頭結點的的雙向循環鏈表中的第i個位置插入元素e
    //尋找第i-1個元素p后插法
    int j = 0; //計數器
    DuLinkList p = L; //p作為工作目標指針
    DuLinkList s;//新結點
    while (j<i - 1 && p) { //尋找第i-1個元素,插入第i-1個元素后面
        p = p->next; //移動指針
        j++; //計數器+1
    }
    if (!p) { //表的長度小於i,空表
        return FALSE;
    }
    s = (DuLinkList)malloc(sizeof(ElemType));//開辟內存
    if (!s) { //空間不夠,溢出
        exit(OVERFLOW);
    }
    s->data = e;//數據域賦值
                //第i-1個元素, p后插入,
    s->next = p->next;
    s->prior = p;
    (p->next)->prior = s;
    p->next = s;
}
Status ListInsert_Dul_Head_Tan(DuLinkList &L, int i, ElemType e) {
    //在帶頭結點的的雙向循環鏈表中的第i個位置 插入元素e
    //尋找第i個元素p前插法
    int j = 0; //計數器
    DuLinkList p = L; //p作為工作目標指針
    DuLinkList s;//新結點
    while (j <= i - 1 && p) { //尋找第i個元素,插入第i個元素前面
        p = p->next; //移動指針
        j++;//計數器+1
    }
    if (!p) {
        return FALSE;//表的長度小於i
    }
    s = (DuLinkList)malloc(sizeof(ElemType));
    if (!s) {
        exit(OVERFLOW);//空間不夠,溢出
    }
    s->data = e; //數據域賦值
                 //第i個元素, p前插入,
    s->next = p;
    s->prior = p->prior;
    (p->prior)->next = s;
    p->prior = s;
}
Status ListDelete_Dul(DuLinkList &L,int i,ElemType e) {
    //在帶頭結點的的雙向循環鏈表中的第i個位置 刪除元素e
    int j = 0; //計數器
    DuLinkList p = L; //p作為工作目標指針
    DuLinkList pre;//作用結點pre
    DuLinkList nex;//作用結點nex
    DuLinkList s;//作用結點cur
    while (j <= i - 1 && p) { //尋找第i個元素,插入第i個元素前面
        p = p->next; //移動指針
        j++;//計數器+1
    }
    s = p;
    pre = p->prior;
    nex = p->next;
    e = s->data; //數據域賦值
    pre->next = nex->prior;
    nex->prior = pre->next;
    free(s);
    return TRUE;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM