程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言入門知識 >> C語言實現單鏈表(不帶頭結點)的逆序打印

C語言實現單鏈表(不帶頭結點)的逆序打印

編輯:C語言入門知識

我在前面幾篇博客中《C語言實現鏈表節點的插入》《C語言實現鏈表節點的刪除》《C實現頭插法和尾插法來構建鏈表》《C語言實現鏈表的基本操作》實現了單鏈表的很多增刪改查操作。這裡我們要來實現單鏈表的逆序打印,使用C來實現。代碼上傳至 https://github.com/chenyufeng1991/ReverseLinkedList。

基本算法是:

(1)使用尾插法構建原鏈表;

(2)依次遍歷原鏈表;

(3)取出遍歷中的節點使用頭插法建立一個新鏈表;

(4)打印逆序後的新鏈表;

原理就是頭插法每次插入的節點都是鏈表的第一個,第一個插入的會變成最後一個,最後一個插入的就成了第一個節點。所以就會造成逆序。

核心代碼如下:

//聲明逆序後的鏈表
Node *pReverseList;

//頭插法建立逆序後的鏈表
void HeadInsert(Node *pInsert){
    if (pReverseList == NULL) {
        //這個是第一個節點
        pReverseList = pInsert;
    }else{
        //下面的是頭插的語句
        pInsert->next = pReverseList;
        pReverseList = pInsert;
    }
}

//遍歷鏈表並使用頭插法構建新鏈表
void scanList(Node *pNode){
    //首先判斷原鏈表是否為空;
    if (pNode == NULL) {
        printf("%s函數執行,原鏈表為空,無法逆序輸出\n",__FUNCTION__);
    }else{

        Node *pMove;    //該節點用來在原鏈表中移動
        Node *pInsert;  //該節點為新建的插入節點
        pInsert = (Node *)malloc(sizeof(Node));
        memset(pInsert, 0, sizeof(Node));
        pInsert->next = NULL;

        pMove = pNode;
        while (pMove != NULL) {
            //遍歷到每一個節點後,調用頭插法函數插入新鏈表
            pInsert->element = pMove->element;
            HeadInsert(pInsert);

            //為插入的下一個節點分配空間
            pInsert = (Node *)malloc(sizeof(Node));
            memset(pInsert, 0, sizeof(Node));
            pInsert->next = NULL;
            pMove = pMove->next;
        }
        
        printf("%s函數執行,逆序鏈表完成\n",__FUNCTION__);
    }
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved