中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

雙向循環鏈表

發布時間:2020-08-06 14:54:42 來源:網絡 閱讀:972 作者:長路慢 欄目:編程語言

循環雙向鏈表如下圖所示:
雙向循環鏈表
 大家通過圖來看與循環單鏈表基本是一樣,代碼的套路也基本一樣,除了每個節點都多一個前驅。
 很多和我一樣的初學者都很困惑,單鏈表,雙鏈表,還有循環鏈表為什么搞那么復雜,很簡單因為需求。
 學編程你不得不時刻容納新知識,很多人沒有去深入去學習,就像沒有驅動一樣。有單向就有雙向,有雙向就有循環,更多的需求讓大家進步,就像人不懂得滿足。
 有些人問我,為什么別人能夠把代碼邏輯寫的清晰,為什么如何別人能夠那么優秀,很多人說:練習的多,敲代碼量大,不得不否認確實有這方面因素,但是我認為思考更為重要。大量的思考讓這些編程員中腦子可以浮動出任何的算法與數據結構,這也許才是真正的靈魂。
 扯遠了,再來一張構造雙向鏈表的圖,因為與單鏈表不同,所以格外做了一張圖讓剛學習的朋友們刪除等參考,分享更多的知識。
雙向循環鏈表

代碼如下:

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

typedef struct Node
{
    int data;
    struct Node *next;
    struct Node *prior;
}Node,*PNode;

void ControlLinkList(PNode PHead);                      //控制函數
PNode CreateLinkList(void);                             //構造雙向循環鏈表
int PositionLinkList(PNode PHead);                      //正向遍歷
void ReverseLinkList(PNode PHead);                      //逆向遍歷
void InsertLinkList(PNode PHead, int pos, int len);     //插入某節點
void DeleteLinkList(PNode PHead, int pos);              //刪除某節點
void FindDLinkList(PNode PHead, int pos);               //查詢某節點
void ReleaseLinkList(PNode PHead);                      //釋放鏈表
void ReversesLinkList(PNode PHaed);                     //反轉鏈表--對于循環雙向鏈表反轉沒有太大意義

int main(void)
{

    PNode PHead = CreateLinkList();
    ControlLinkList(PHead);
    return 0;
}

PNode CreateLinkList(void)
{
    int len = 0;
    int i;
    PNode PHead = (PNode)malloc(sizeof(Node));
    PNode r;
    if( NULL == PHead )
    {
        printf("分配內存失敗\n");
        exit(EXIT_FAILURE);
    }
    //初始化頭
    PHead->data = 0;
    PHead->prior = PHead;
    PHead->next = PHead;
    r = PHead;

    printf("請輸入構造幾個節點: ");
    scanf("%d",&len);

    for( i = 0; i < len; i++ )
    {
        PNode p = (PNode)malloc(sizeof(Node));
        if( NULL == p )
        {
            printf("分配內存失敗\n");
            exit(EXIT_FAILURE);
        }

        printf("Please input of data: ");
        scanf("%d",&p->data);

        p->next = NULL;                             //后驅為NULL
        p->prior = r;                               //前驅指向r也就是PHead頭節點
        r->next = p;                                //然后r的后驅也就PHead的后驅指向p
        r = p;                                      //最后r = p;
    }
    r->next = PHead;
    PHead->prior = r;                               //這兩步完成了鏈表循環,頭尾想指
    return PHead;                                   //循環雙向鏈表返回頭指針既可以正向反向遍歷
}

int PositionLinkList(PNode PHead)
{
    int i = 0;
    PNode p = PHead->next;                          //PHead->next才是鏈表第一個元素
    while( NULL != p && PHead != p )
    {
        i++;
        printf("No.%d of Data = %d\n",i,p->data);
        p = p->next;
    }
    printf("正向遍歷成功");
    return i;
}

void ReverseLinkList(PNode PHead)
{
    int i = 0;
    PNode p = PHead->prior;                         //指向了鏈表尾部r
    while( NULL != p && p != PHead )
    {
        i++;
        printf("No.%d of Data = %d\n",i,p->data);
        p = p->prior;
    }
    printf("逆向遍歷成功\n");
}

void InsertLinkList(PNode PHead, int pos, int data)
{
    int i = 1;
    PNode p = PHead->next;
    PNode PNew = (PNode)malloc(sizeof(Node));
    if( NULL == p )
    {
        printf("內存分配失敗\n");
        exit(EXIT_FAILURE);
    }

    while( p != NULL && i != pos-1 )
    {
        i++;
        p = p->next;
    }

    PNew->data = data;
    p->next->prior = PNew;
    PNew->next = p->next;
    p->next = PNew;
    PNew->prior = p;

    printf("插入成功\n");
}

void FindLinkList(PNode PHead, int pos)
{
    PNode p = PHead->next;
    int i = 1;
    while( NULL !=p && i != pos )
    {
        i++;
        p = p->next; 
    }
    printf("No.%d of Data = %d\n", i, p->data);
}

void DeleteLinkList(PNode PHead, int pos)
{
    int i = 1;
    PNode p = PHead->next;
    PNode temp;
    while( NULL !=p && i != pos )
    {
        i++;
        p = p->next;
    }

    temp = p->next;                     //temp指向刪除的節點
    p->next = p->next->next;            //p->next節點指向刪除節點的next
    p->next->next->prior = p;   
    free(temp);
    printf("刪除節點成功\n");
}

void ReleaseLinkList(PNode PHead)
{
    PNode p,q;
    p = PHead;
    q = p->next;
    while( q != PHead )
    {
        p = q;
        q = p->next;
        free(p);
    }
    free(PHead);
    printf("釋放內存成功");
}

void ControlLinkList(PNode PHead)
{
    int len = 0;
    int pos = 0;
    len = PositionLinkList(PHead);
    ReverseLinkList(PHead);
    printf("請輸入pos節點:  ");
    scanf("%d",&pos);
    InsertLinkList(PHead, pos, 10);
    PositionLinkList(PHead);
    printf("請輸入查詢的節點:  ");
    scanf("%d",&pos);
    FindLinkList(PHead, pos);
    printf("請輸入刪除的節點:  ");
    scanf("%d",&pos);
    DeleteLinkList(PHead, pos);
    PositionLinkList(PHead);
    ReleaseLinkList(PHead);
}
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永定县| 拉萨市| 即墨市| 汉中市| 赤水市| 息烽县| 西藏| 彭山县| 乐昌市| 广南县| 三台县| 招远市| 华池县| 涪陵区| 明光市| 乐至县| 冀州市| 通渭县| 屏边| 磐安县| 全州县| 张北县| 绍兴县| 阳山县| 桑日县| 区。| 西藏| 西乡县| 伊金霍洛旗| 巴彦县| 宁都县| 枝江市| 穆棱市| 奎屯市| 凯里市| 舒城县| 冀州市| 建始县| 杭锦旗| 乃东县| 正镶白旗|