1. 程式人生 > >連結串列各類操作詳解(講得非常詳細)

連結串列各類操作詳解(講得非常詳細)

原文連結:http://blog.csdn.net/hackbuteer1/article/details/6591486/

   連結串列概述
   連結串列是一種常見的重要的資料結構。它是動態地進行儲存分配的一種結構。它可以根據需要開闢記憶體單元。連結串列有一個“頭指標”變數,以head表示,它存放一個地址。該地址指向一個元素。連結串列中每一個元素稱為“結點”,每個結點都應包括兩個部分:一為使用者需要用的實際資料,二為下一個結點的地址。因此,head指向第一個元素:第一個元素又指向第二個元素;……,直到最後一個元素,該元素不再指向其它元素,它稱為“表尾”,它的地址部分放一個“NULL”(表示“空地址”),連結串列到此結束。
        連結串列的各類操作包括:學習單向連結串列的建立、刪除、  插入(無序、有序)、輸出、  排序(選擇、插入、冒泡)、反序等等。

       單向連結串列的圖示:
       ---->[NULL]
      head

      圖1:空連結串列

       ---->[p1]---->[p2]...---->[pn]---->[NULL]
      head   p1->next  p2->next   pn->next

      圖2:有N個節點的連結串列

      建立n個節點的連結串列的函式為:

  1. #include "stdlib.h"
  2. #include "stdio.h"
  3. #define NULL 0
  4. #define LEN sizeof(struct student)
  5. struct student  
  6. {  
  7.     int num;              //學號 
  8.     float score;          //分數,其他資訊可以繼續在下面增加欄位
  9.     struct student *next;       //指向下一節點的指標
  10. };  
  11. int n;  //節點總數 
  12. /* 
  13. ========================== 
  14. 功能:建立n個節點的連結串列 
  15. 返回:指向連結串列表頭的指標 
  16. ========================== 
  17. */
  18. struct student *Create()  
  19. {  
  20.     struct
     student *head;       //頭節點
  21.     struct student *p1 = NULL;  //p1儲存建立的新節點的地址
  22.     struct student *p2 = NULL;  //p2儲存原連結串列最後一個節點的地址
  23.     n = 0;          //建立前連結串列的節點總數為0:空連結串列
  24.     p1 = (struct student *) malloc (LEN);   //開闢一個新節點
  25.     p2 = p1;            //如果節點開闢成功,則p2先把它的指標儲存下來以備後用
  26.     if(p1==NULL)        //節點開闢不成功
  27.     {  
  28.         printf ("\nCann't create it, try it again in a moment!\n");  
  29.         return NULL;  
  30.     }  
  31.     else//節點開闢成功
  32.     {  
  33.         head = NULL;        //開始head指向NULL
  34.         printf ("Please input %d node -- num,score: ", n + 1);  
  35.         scanf ("%d %f", &(p1->num), &(p1->score));    //錄入資料
  36.     }  
  37.     while(p1->num != 0)      //只要學號不為0,就繼續錄入下一個節點
  38.     {  
  39.         n += 1;         //節點總數增加1個
  40.         if(n == 1)      //如果節點總數是1,則head指向剛建立的節點p1
  41.         {  
  42.             head = p1;  
  43.             p2->next = NULL;  //此時的p2就是p1,也就是p1->next指向NULL。
  44.         }  
  45.         else
  46.         {  
  47.             p2->next = p1;   //指向上次下面剛剛開闢的新節點
  48.         }  
  49.         p2 = p1;            //把p1的地址給p2保留,然後p1產生新的節點
  50.         p1 = (struct student *) malloc (LEN);  
  51.         printf ("Please input %d node -- num,score: ", n + 1);  
  52.         scanf ("%d %f", &(p1->num), &(p1->score));  
  53.     }  
  54.     p2->next = NULL;     //此句就是根據單向連結串列的最後一個節點要指向NULL
  55.     free(p1);           //p1->num為0的時候跳出了while迴圈,並且釋放p1
  56.     p1 = NULL;          //特別不要忘記把釋放的變數清空置為NULL,否則就變成"野指標",即地址不確定的指標
  57.     return head;        //返回建立連結串列的頭指標 
  58. }  

      輸出連結串列中節點的函式為:

  1. /* 
  2. =========================== 
  3.  功能:輸出節點 
  4.  返回: void 
  5. =========================== 
  6. */
  7. void Print(struct student *head)  
  8. {  
  9.     struct student *p;  
  10.     printf ("\nNow , These %d records are:\n", n);  
  11.     p = head;  
  12.     if(head != NULL)        //只要不是空連結串列,就輸出連結串列中所有節點
  13.     {  
  14.         printf("head is %o\n", head);    //輸出頭指標指向的地址
  15.         do
  16.         {  
  17.             /* 
  18.             輸出相應的值:當前節點地址、各欄位值、當前節點的下一節點地址。 
  19.             這樣輸出便於讀者形象看到一個單向連結串列在計算機中的儲存結構,和我們 
  20.             設計的圖示是一模一樣的。 
  21.             */
  22.             printf ("%o   %d   %5.1f   %o\n", p, p->num, p->score, p->next);  
  23.             p = p->next;     //移到下一個節點
  24.         }  
  25.         while (p != NULL);  
  26.     }  
  27. }  

       單向連結串列的刪除圖示:
       ---->[NULL]
       head

       圖3:空連結串列

      從圖3可知,空連結串列顯然不能刪除

      ---->[1]---->[2]...---->[n]---->[NULL](原連結串列)
      head   1->next  2->next   n->next

      ---->[2]...---->[n]---->[NULL](刪除後連結串列)
      head   2->next   n->next

      圖4:有N個節點的連結串列,刪除第一個節點
      結合原連結串列和刪除後的連結串列,就很容易寫出相應的程式碼。操作方法如下:
      1、你要明白head就是第1個節點,head->next就是第2個節點;
       2、刪除後head指向第2個節點,就是讓head=head->next,OK這樣就行了。

       ---->[1]---->[2]---->[3]...---->[n]---->[NULL](原連結串列)
       head   1->next  2->next  3->next   n->next

       ---->[1]---->[3]...---->[n]---->[NULL](刪除後連結串列)
      head   1->next  3->next   n->next

      圖5:有N個節點的連結串列,刪除中間一個(這裡圖示刪除第2個)
      結合原連結串列和刪除後的連結串列,就很容易寫出相應的程式碼。操作方法如下:
      1、你要明白head就是第1個節點,1->next就是第2個節點,2->next就是第3個節點;
      2、刪除後2,1指向第3個節點,就是讓1->next=2->next。

      刪除指定學號的節點的函式為:

  1. /* 
  2. ========================== 
  3.  功能:刪除指定節點 
  4.   (此例中是刪除指定學號的節點) 
  5.  返回:指向連結串列表頭的指標 
  6. ========================== 
  7. */
  8. struct student *Del (struct student *head, int num)  
  9. {  
  10.     struct student *p1;     //p1儲存當前需要檢查的節點的地址
  11.     struct student *p2;     //p2儲存當前檢查過的節點的地址
  12.     if (head == NULL)       //是空連結串列(結合圖3理解)
  13.     {  
  14.         printf ("\nList is null!\n");  
  15. 相關推薦

    連結串列各類操作非常詳細

    原文連結:http://blog.csdn.net/hackbuteer1/article/details/6591486/    連結串列概述    連結串列是一種常見的重要的資料結構。它是動態地進行儲存分配的一種結構。它可以根據需要開闢記憶體單元。連結串列有一

    C語言連結串列各類操作

              連結串列概述    連結串列是一種常見的重要的資料結構。它是動態地進行儲存分配的一種結構。它可以根據需要開闢記憶體單元。連結串列有一個“頭指標”變數,以head表示,它存放一個地址。該地址指向一個元素。連結串列中每一個元素稱為“結點”,每個結點都

    靜態連結串列插入和刪除操作C語言程式碼實現

    本節主要講解靜態連結串列的插入和刪除操作,有關靜態連結串列的詳細講解請閱讀《靜態連結串列及C語言實現》一文。 在講解靜態連結串列的插入和刪除操作之前,我們假設有如下的靜態連結串列: 圖中,array[0] 用作備用連結串列的頭結點,array[1] 用作存放資料的連結串列的頭結點,array[0]

    連結串列反轉方法含實現程式碼

    怎麼反轉連結串列呢?這個是面試中經常出現的一道題。一般在資料結構或者演算法的面試題中,儘量不使用額外的空間去實現,儘管現在的計算機空間很充足,但是面試考察的還是對於整體效能的考慮。 方法其實有很多,我們可以依次遍歷連結串列,然後依次使用頭插入的方法來達到目的。 其中有個簡單的方法,就是把連結串列的每個指標

    連結串列的插入和刪除操作C語言實現+註釋

    連結串列的基本操作中,連結串列結點的插入和刪除相對比較複雜,需根據結點插入位置的不同,使用合理的方法在不破壞原連結串列結構的前提下將其插入到連結串列中。 本節將詳解介紹這兩種操作的具體實現方法,讀者只需牢記實現步驟,即可輕鬆解決這兩大難點。 連結串列中插入結點 連結串列中插入結點,根據插入位置的不同,可

    Git遠程操作新手必備

    tar etc rename 也有 mas 本地文件 轉載 其中 efault Git是目前最流行的版本管理系統,學會Git幾乎成了開發者的必備技能。 Git有很多優勢,其中之一就是遠程操作非常簡便。本文詳細介紹5個Git命令,它們的概念和用法,理解了這些內容,你就會完全掌

    HTML對字型的所有操作經典

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

    資料結構-線性表-連結串列的程式碼

    繼上篇文章對順序表的介紹,這篇文章介紹連結串列,作為資料結構中最重要的一大模組,連結串列也是以後常用的 單鏈表是其中的核心,理解了單鏈表,其實連結串列的知識你也就掌握了。 程式碼附在最後!!!!    思路在程式註釋。詳解 一。 1.程式碼部分 一包    三類   

    資料結構--連結串列的排序

    1、前言  前面兩篇部落格,我已經把線性表的兩種基本的表示形式,做了一個基本的介紹和一些對比。但是,我突然發現在連結串列這裡我缺少一個很重要的內容,那就是對我們的連結串列進行排序,其實,在連線兩個連結串列的時候,就要求我們的那兩個連結串列是有序的。 2、連結串列排序—最簡單、直接的方式

    動態代理 靜態代理 代理模式的很好 淺顯易懂

    們在Java程式碼中定義的。 通常情況下, 靜態代理中的代理類和委託類會實現同一介面或是派生自相同的父類。 一、概述 1. 什麼是代理 我們大家都知道微商代理,簡單地說就是代替廠家賣商品,廠家“委託”代理為其銷售商品。關於微商代理,首先我們從他們那裡買東

    Java 原子操作AtomicInteger、AtomicIntegerArray等

    當程式更新一個變數時,如果多執行緒同時更新這個變數,可能得到期望之外的值,比如變數i=1,A執行緒更新i+1,B執行緒也更新i+1,經過兩個執行緒操作之後可能i不等於3,而是等於2。因為A和B執行緒在更新變數i的時候拿到的i都是1,這就是執行緒不安全的更新操作,通常我們會使

    C++文件操作ifstream、ofstream、fstream

      轉自:http://www.cnblogs.com/azraelly/archive/2012/04/14/2446914.html C++ 通過以下幾個類支援文件的輸入輸出: ofstream: 寫操作(輸出)的文件類 (由ostream引申而來) ifstr

    連結串列的建立-

    #include<iostream> #include<queue> #include<malloc.h>//建造空間malloc頭 #include<stdio.h> #include<string.h> using namespace

    JDK 原子操作AtomicInteger、AtomicIntegerArray等

    當程式更新一個變數時,如果多執行緒同時更新這個變數,可能得到期望之外的值,比如變數i=1,A執行緒更新i+1,B執行緒也更新i+1,經過兩個執行緒操作之後可能i不等於3,而是等於2。因為A和B執行緒在更新變數i的時候拿到的i都是1,這就是執行緒不安全的更新操作,通常我們會使用

    NandFlash操作

    NandFlash讀操作:          NandFlash的讀取分為頁讀和隨機讀。頁讀每次讀取一個page,從page的第一個資料開始讀。其實也就是列號(偏移地址)為0,只提供頁地址。 隨機讀能讀取到一個page裡面的某個儲存單元,但是需要提供行地址和列地址。    

    Hive最新資料操作超級詳細

    資料操作能力是大資料分析至關重要的能力。資料操作主要包括:更改(exchange),移動(moving),排序(sorting),轉換(transforming)。Hive提供了諸多查詢語句,關鍵字,操作和方法來進行資料操作。一、 資料更改 資料更改主要包括:LOAD, I

    Linux檔案操作--資料夾的建立mkdir命令

    一、mkdir命令簡介 mkdir命令用來建立目錄。該命令建立由dirname命名的目錄。如果在目錄名的前面沒有加任何路徑名,則在當前目錄下建立由dirname指定的目錄;如果給出了一個已經存在的路徑,將會在該目錄下建立一個指定的目錄。在建立目錄時,應保證新建

    C# 檔案操作FileInfo類

    本篇讓我們一起看一下FileInfo類如何使用。     FileInfo類  提供了與File類相同的功能,不同的是FileInfo提供的都是成員方法   1、讀檔案 1 2 3 4 //摘要:建立只讀 System.IO.FileStrea

    自己編寫連結串列函式庫

    標頭檔案 #ifndef _LINKLIST_H #define _LINKLIST_H #define SUCCESS 10000 #define FAILURE 10001 #define TRUE 10002 #define FALSE 10003

    Linux下串列埠通訊開啟串列埠和串列埠初始化

    linux下串列埠通訊主要有下面幾個步驟 串列埠通訊流程圖 下面我會一一介紹這幾個步驟。 1.開啟串列埠 程式碼(串列埠為ttyUSB0) //開啟串列埠 int open_port(void) { int fd; fd=open("/dev/ttyUSB0