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

溫馨提示×

溫馨提示×

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

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

單鏈表逆序操作

發布時間:2020-07-20 11:01:12 來源:網絡 閱讀:893 作者:WuWeiZhu 欄目:編程語言

//逆序操作
//算法1:從第二個節點開始,記錄它的下一個節點,然后依次挪到第一個節點之前成為新表頭
int inverse_node(struct node pH)
{
struct node
p = pH; //頭結點
struct node pPrev = NULL; //記錄前一個節點
struct node
pBack = NULL; //記錄下一個節點地址
struct node *pFirstNode = p->pNext; //記錄第一個節點

//節點只有1個或者無有效節點時,返回原來的鏈表,不用進行逆序操作
if((NULL == pFirstNode) | (NULL == pFirstNode->pNext))  
{
    return 0;
}
//節點數兩個或以上時
else
{   
    p = p->pNext;           //節點1   
    pBack = p->pNext;       //節點2
    pPrev = p;              //節點1
    p = pBack;              //節點2

    while(NULL != p->pNext)
    {
        pBack = p->pNext;   //節點3
        pH->pNext = p;
        p->pNext = pPrev;
        pPrev = p;
        p = pBack;
    }   
}

pH->pNext = p;
p->pNext = pPrev;

pFirstNode->pNext = NULL;

return 0;

}
運行結果:
單鏈表逆序操作

整體代碼:

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

//單鏈表的節點模型。
struct node
{
int data;
struct node *pNext;
};

//創建一個節點。
//有效數據為data。
//返回一個指針,該指針指向struct node類型,即創建的節點。
struct node create_node(int data)
{
//malloc申請一段內存來存儲數據
struct node
p = (struct node *)malloc(sizeof(struct node));

//檢驗是否申請內存成功
if(NULL == p)
{
    printf("malloc error.\n");
    return NULL;
}

p->data = data;
p->pNext = NULL;

return p;

}

//從尾部插入一個新的節點new,pH為頭節點
void insert_tail(struct node pH, struct node new)
{
struct node *p = pH;

//讓p指向最后一個節點
while(NULL != p->pNext)
{
    p = p->pNext;
}

p->pNext = new;

}

//從頭部插入一個新的節點,pH為頭節點,new為新插入節點
void insert_head(struct node pH, struct node new)
{
struct node *p = pH;

if(NULL == p->pNext)
{
    p->pNext = new;
}
else
{
    new->pNext = p->pNext;
    p->pNext = new;
}

}

//遍歷節點
void ergodic(struct node pH)
{
struct node
p = pH;

while(NULL != p->pNext)
{
    p = p->pNext;
    printf("node data is %d\n",p->data);
}

}

//刪除存儲數據為data的節點
void delete_node(struct node pH, int data)
{
struct node
p = pH;
struct node *pPrev = NULL;

while(NULL != p->pNext)
{
    pPrev = p;                      //這個指針用來存儲上一個節點的地址
    p = p->pNext;                   //p指向下一個節點

    //找到要刪除的節點
    if(p->data == data)
    {
        //這個節點是尾節點
        if(NULL == p->pNext)
        {
            pPrev->pNext = NULL;
        }
        //不是尾節點
        else
        {
            pPrev->pNext = p->pNext;
        }

        free(p);                    //刪除節點,釋放節點的存儲空間
    }
}

}

//逆序操作
//算法1:從第二個節點開始,記錄它的下一個節點,然后依次挪到第一個節點之前成為新表頭
int inverse_node(struct node pH)
{
struct node
p = pH; //頭結點
struct node pPrev = NULL; //記錄前一個節點
struct node
pBack = NULL; //記錄下一個節點地址
struct node *pFirstNode = p->pNext; //記錄第一個節點

//節點只有1個或者無有效節點時,返回原來的鏈表,不用進行逆序操作
if((NULL == pFirstNode) | (NULL == pFirstNode->pNext))  
{
    return 0;
}
//節點數兩個或以上時
else
{   
    p = p->pNext;           //節點1   
    pBack = p->pNext;       //節點2
    pPrev = p;              //節點1
    p = pBack;              //節點2

    while(NULL != p->pNext)
    {
        pBack = p->pNext;   //節點3
        pH->pNext = p;
        p->pNext = pPrev;
        pPrev = p;
        p = pBack;
    }   
}

pH->pNext = p;
p->pNext = pPrev;

pFirstNode->pNext = NULL;

return 0;

}

int main(void)
{
//頭指針指向頭結點
struct node pHead = NULL;
pHead = create_node(0);
//struct node
pHead = create_node(0);

insert_tail(pHead, create_node(11));
insert_tail(pHead, create_node(12));
insert_tail(pHead, create_node(13));
insert_tail(pHead, create_node(14));
insert_tail(pHead, create_node(15));
insert_tail(pHead, create_node(16));
insert_tail(pHead, create_node(17));

ergodic(pHead);

inverse_node(pHead);

printf("------------逆序后------------\n");

ergodic(pHead);

/
pHead->pNext = create_node(11);
pHead->pNext->pNext = create_node(12);
pHead->pNext->pNext->pNext = create_node(13);
/
/
printf("node1 data : %d\n",pHead->pNext->data);
printf("node2 data : %d\n",pHead->pNext->pNext->data);
printf("node3 data : %d\n",pHead->pNext->pNext->pNext->data);
/
return 0;
}

向AI問一下細節

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

AI

台北市| 布尔津县| 大安市| 蒙阴县| 永清县| 廊坊市| 武强县| 塘沽区| 溆浦县| 苍梧县| 天全县| 金川县| 琼海市| 温州市| 宁明县| 易门县| 肥乡县| 荃湾区| 南汇区| 广安市| 太保市| 洪洞县| 浦城县| 哈尔滨市| 桐梓县| 甘孜| 横山县| 乃东县| 永仁县| 阜新市| 冀州市| 武鸣县| 济南市| 清涧县| 襄汾县| 黄梅县| 泰安市| 崇左市| 宁河县| 濉溪县| 双桥区|