1. 程式人生 > >C語言實現單鏈表逆序與逆序輸出例項

C語言實現單鏈表逆序與逆序輸出例項

這篇文章主要介紹了C語言實現單鏈表逆序與逆序輸出,是資料結構與演算法中比較基礎的重要內容,有必要加以牢固掌握,需要的朋友可以參考下

單鏈表的逆序輸出分為兩種情況,一種是隻逆序輸出,實際上不逆序;另一種是把連結串列逆序。本文就分別例項講述一下兩種方法。具體如下:

1.逆序輸出

#include<iostream>
#include<stack>
#include<assert.h>
using namespace std;

typedef struct node{
    int data;
    node * next;
}node;

//尾部新增
node * add(int n, node * head){ node * t = new node; t->data = n; t->next = NULL; if (head == NULL){ head = t; } else if (head->next == NULL){ head->next = t; } else{ node * p = head->next; while (p->next != NULL){ p =
p->next; } p->next = t; } return head; } //順序輸出 void print(node * head){ node * p = head; while (p != NULL){ cout << p->data << " "; p = p->next; } cout << endl; } //遞迴 void reversePrint(node * p){ if (p != NULL
){ reversePrint(p->next); cout << p->data << " "; } } //棧 void reversePrint2(node * head){ stack<int> s; while (head != NULL){ s.push(head->data); head = head->next; } while (!s.empty()){ cout << s.top() << " "; s.pop(); } } int main(){ node * head = NULL; for (int i = 1; i <= 5; i++){ head = add(i, head); } print(head); reversePrint(head); reversePrint2(head); system("pause"); return 0; }

逆序輸出可以用三種方法: 遞迴,棧,逆序後輸出。最後一種接下來講到。

2.單鏈表逆序

#include<iostream>
#include<stack>
#include<assert.h>
using namespace std;


typedef struct node{
    int data;
    node * next;
}node;

node * add(int n, node * head){
    node * t = new node;
    t->data = n;
    t->next = NULL;
    if (head == NULL){
        head = t;
    }
    else if (head->next == NULL){
        head->next = t;
    }
    else{
        node * p = head->next;
        while (p->next != NULL){
            p = p->next;
        }
        p->next = t;
    }
    return head;
}

//迴圈
node * reverse(node * head){

    if (head == NULL || head->next == NULL){
        return head;
    }

    node * p1 = head;
    node * p2 = head->next;
    node * p3 = NULL; 
    head->next = NULL;

    while (p2 != NULL){
        p3 = p2;
        p2 = p2->next;
        p3->next = p1;
        p1 = p3;
    }
    head = p1;
    return head;
}

void print(node * head){
    node * p = head;
    while (p != NULL){
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}


//遞迴
node * reverse2(node * p){
    if (p == NULL || p->next == NULL){
        return p;
    }

    node * newHead = reverse2(p->next);
    p->next->next = p;
    p->next = NULL;
    return newHead;
}


int main(){

    node * head = NULL;
    for (int i = 1; i <= 5; i++){
        head = add(i, head);
    }
    print(head);
    head = reverse(head);
    print(head);
    head = reverse2(head);
    print(head);

    system("pause");
    return 0;
}

這裡連結串列逆序用了兩種方法:迴圈,遞迴。讀者最容易理解的方法就是在紙上自己畫一下。

希望本文所述例項對大家的資料結構與演算法學習能有所幫助。

相關推薦

C語言實現單鏈輸出例項

這篇文章主要介紹了C語言實現單鏈表逆序與逆序輸出,是資料結構與演算法中比較基礎的重要內容,有必要加以牢固掌握,需要的朋友可以參考下 單鏈表的逆序輸出分為兩種情況,一種是隻逆序輸出,實際上不逆序;另一種是把連結串列逆序。本文就分別例項講述一下兩種方法。具

c語言實現單鏈輸出

<span style="font-family: Arial, Helvetica, sans-serif;">可以用遞迴,如果沒到連結串列尾,則遞迴查詢,否則輸出當前值。下面只是演算法表示,不能直接放到程式裡編譯執行。</span><span style="fo

C語言實現單鏈

      單鏈表的逆置是一個非常經典的問題,這裡利用兩個思想進行解決。      首先,我們需要看下原理圖,其實兩個思想都是一樣的,都是使後一個的節點的 next 指標指向前一個節點,依次遞推,直到第二個節點指向第一個節點,第一個節點的 next 指標指向 NULL。   

C語言實現單鏈節點的刪除(帶頭結點)

data art pos grand urn ria tps move sni 我在之前一篇博客《C語言實現單鏈表節點的刪除(不帶頭結點)》中具體實現了怎樣在一個不帶頭結點的單鏈表的刪除一個節點,在這一篇博客中我改成了帶頭結點的單鏈表。代碼演示樣例上傳至 h

C語言實現單鏈的節點插入(帶頭結點)

alloc tails 函數 file ret con 實現 單獨 fun 我在之前一篇博客《C語言實現單鏈表(不帶頭結點)節點的插入》中具體實現了怎樣在一個不帶頭結點的單鏈表中進行節點的插入。可是在實際應用中,帶頭結點的鏈表更為經常使用。更為方便。今天我們

c語言實現單鏈的所有介面

此次工程還是使用了3個原始檔slist.h(標頭檔案原始碼),slist.c(實現介面的具體程式碼),test.c(單鏈表邏輯) slist.h #pragma once #include<stdio.h> #include<stdlib.h> #inclu

C語言實現單鏈反轉

最近在考研複習,記錄一下基礎的資料結構演算法,有事沒事翻一翻,以防忘了 自己寫了個翻轉連結串列演算法,感覺要比別人的要通俗易懂些 void Reverse(List *L){ //分別是當前節點,直接前驅節點,直接後繼節點 LNode *current,

C語言實現單鏈演算法

#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct slist_node_s { struct slist_node_

關於C語言實現單鏈為什麼要用二級指標

一級指標作為函式引數可以交換兩個數的值,二級指標作為函式引數可以改變一級指標的值,也就是改變地址。 typedef struct linknode{ char* data; linknode* next }linknode, linklist; 單鏈表中的尾插函式,如果傳入一個一級指標

C語言實現單鏈的增刪查改

連結串列:一種鏈式儲存的線性表,用一組地址任意的儲存單元存放線性表的資料元素,稱儲存單元為一個節點。 連結串列分類: 單鏈表 雙鏈表 雙向迴圈連結串列 程式碼實現單鏈表的增刪查改: linklist.h檔案 #pragma once #incl

C語言實現單鏈的建立、插入、刪除

節點資料結構: /* *定義鏈式儲存線性表的結構 */ typedef struct LNode { int data; //資料域 struct LNode * next;

c語言實現單鏈資料結構及其基本操作

 帶頭結點單鏈表。分三個檔案,分別為標頭檔案,測試檔案,原始碼檔案。 給出了單鏈表的部分操作,每個操作都有對應的註釋說明該函式功能。 test.c  檔案中,對輸入資料是否合法進行了檢測,但是並未實現輸入資料不合法時應該採取的措施。 測試檔案  通過一個選單來測試單鏈

C語言單鏈實現(二) 就地置,就地歸併

#include<iostream> #include<stdio.h> #include<math.h> #define LEN sizeof(struct Nodelist) using namespace std; typedef

C語言單鏈實現佇列(初始化,入隊,出隊,元素個數,隊首元素,是否為空)

單鏈表實現佇列: 連結串列為空的判斷條件:pQueue->pFront==pQueue->pRear或者若結構體中存在數的個數時,判斷pQueue->size==0,即元素個數為0 標頭檔案:佇列.h #pragma once #include<

C語言單鏈實現

單鏈表 單鏈表是一種鏈式存取的資料結構,用一組地址任意的儲存單元存放線性表中的資料元素。 單鏈表結構如下: typedef int DataType; typedef struct Node { struct Node* next; /

資料結構C語言版--單鏈的基本功能實現

/* * 構造一個鏈式儲存的線性表(當輸入9999時,結束構造過程),然後輸出該線性表 * 並統計該線性連結串列的長度 。 *注:new和delete是C++的運算子 malloc和free是C++/C的標準庫函式 */ #include<st

C語言實現順序的增刪查改和

在資料結構中,我們最開始接觸的就是順序表,那麼順序表是什麼呢?順序表是在計算機記憶體中以陣列的形式儲存的線性表,是指用一組地址連續的儲存單元依次儲存資料元素的線性結構。線性表採用順序儲存的方式儲存就稱之為順序表。順序表是將表中的結點依次存放在計算機記憶體中一組地

C++實現單鏈的建立、置和輸出

題目描述:在已知單鏈表頭節點的情況下,設計演算法逆置單鏈表並輸出 方法一:採用首先將頭節點指向空,讓其變為尾節點,然後利用中間節點 p、q 將其後的節點一個接一個改為指向前面的節點 /******

C語言線性單鏈相關函式和演算法的基本實現

備考期間嘗試寫了一些基本資料結構的C語言實現,現做以下記錄(基本資料元以int型為例):全域性定義及依賴:#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #d

數據結構之---C語言實現廣義頭尾鏈存儲表示

tle substring [1] 原子 depth ring else if max sig //廣義表的頭尾鏈表存儲表示 //楊鑫 #include <stdio.h> #include <malloc.h> #include <std