1. 程式人生 > >C語言連結串列各類操作詳解

C語言連結串列各類操作詳解

          連結串列概述
   連結串列是一種常見的重要的資料結構。它是動態地進行儲存分配的一種結構。它可以根據需要開闢記憶體單元。連結串列有一個“頭指標”變數,以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.         return head;  
  16.     }  
  17.     //定位要刪除的節點
  18.     p1 = head;  
  19.     while (p1->num != num && p1->next != NULL)    //p1指向的節點不是所要查詢的,並且它不是最後一個節點,就繼續往下找
  20.     {  
  21.         p2 = p1;            //儲存當前節點的地址
  22. 相關推薦

    C語言連結串列各類操作

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

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

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

    c語言連結串列(超詳細)

    連結串列是一種常見的基礎資料結構,結構體指標在這裡得到了充分的利用。連結串列可以動態的進行儲存分配,也就是說,連結串列是一個功能極為強大的陣列,他可以在節點中定義多種資料型別,還可以根據需要隨意增添,刪除,插入節點。連結串列都有一個頭指標,一般以head來表示,存放的是一個地

    C語言連結串列:遍歷,頭插,尾插,中間插入;頭節點刪除,尾節點刪除,中間刪除的操作

    /****************************************************************************************************************************************

    C語言連結串列的5種常見操作

    C語言連結串列的5種常見操作 單鏈表反轉 連結串列中環的檢測 兩個有序的連結串列合併 刪除連結串列倒數第n個結點 求連結串列的中間結點 Ref typedef struct list{ int i

    C語言連結串列實現佇列操作

    還是操作佇列,但是這次換成連結串列,但是要注意出隊的操作。 一般的思維是在出隊的時候,刪除頭結點的下一個節點,這樣的話確實可以將佇列中的節點全部刪除,但是如果我們將最後一個節點刪除的時候,我們的演算法就將tail指標賦值為NULL,這時如果再進行入隊操作的時候,就會發生段錯

    c語言——連結串列的基本操作

    #include <stdio.h>typedef int ElementType;typedef struct ListNode{int k;ElementType element;struct ListNode *m_pNext;}ListNode,*PNOD

    C語言連結串列就地逆置操作

    在c語言中,為了節省空間和時間,我們可以採取在原空間上實現連結串列的逆置 每次讀取一個節點時,將他用頭插法的方法加入到連結串列中,最後得到的即是逆置後的連結串列了 關鍵掌握頭插法的思路: q->next=l->next; l->next=q; 下面

    C語言 連結串列的基本操作實現 原始碼

    1 創作初衷   作為一個畢業半年,到公司上班的菜鳥程式猿,卻還沒有參與過一次實際的專案開發,沒有跟著專案寫過一行程式碼, 每天除了自學,就是做做文件之類的工作。所以在此,把之前學過的知識重新拿起來,寫成文章。   本文屬於作者 原創,轉載請註明出處!哦,也許並沒有人能看上

    C語言連結串列(超詳細)

    前言:之前學習連結串列的時候總會遇到一些問題 也看了好多人的文章感覺有些不是太實用 然後後來也是自己摸索才大概寫出來的. 在真正的開發中會把連結串列的增刪改查寫到函式裡 但是刪除有點麻煩 找了很多都是刪除第幾個 而不是刪除某個值對應的節點 讓我很難受 所以想寫一些連結串列的操作分享

    使用C語言連結串列實現商品管理系統

    #include <stdio.h> #include <stdlib.h> #include <windows.h> #define bool char #define true 1 #define false 0 #define NUM 1

    5 種排序演算法--C語言連結串列

    原始碼地址 GitHub:https://github.com/GYT0313/C-DataStructure/blob/master/sortIn5.c 包括: 氣泡排序 快速排序 選擇排序 插入排序 希爾排序 執行: 注意:

    C語言實現八大排序演算法及其效能之間的

    概述 排序是資料結構中的重要一節,也是演算法的重要組成部分。主要分為內部排序以及外部排序,今天我們講內部排序,也就是八大排序。 插入排序 直接插入排序 演算法思想 演算

    1870 Problem B C語言-連結串列排序

    問題 B: C語言-連結串列排序 時間限制: 1 Sec  記憶體限制: 128 MB 提交: 86  解決: 71 [提交][狀態][討論版][命題人:外部匯入] 題目描述 已有a、b兩個連結串列,每個連結

    C語言連結串列的建立插入等綜合實戰

    系本人原創,轉載請註明出處: 程式設計老師讓寫一個連結串列的綜合運用,包括建立,檢視某個節點,刪除某個節點,插入某個節點,以及連結串列的逆序,還必須要有出錯提示和返回。QaQ,,,看見這麼多東西我就想嚶嚶嚶, 先放上鍊表的結構體: typedef struct stud

    C語言連結串列節點插入與刪除

    線性表操作 順序表是我們資料結構中的基本儲存形式,現在給定一個順序表,有如下操作: Insert X Y:在順序表中X位置插入Y元素,遍歷輸出當前順序表的所有元素。 Delete X:刪除順序表中的X元素,如果有多個X元素,只刪除第一個X,遍歷輸出當前順序的所有

    一步一步教你從零開始寫C語言連結串列---構建一個連結串列

    為什麼要學習連結串列? 連結串列主要有以下幾大特性: 1、解決陣列無法儲存多種資料型別的問題。 2、解決陣列中,元素個數無法改變的限制(C99的變長陣列,C++也有變長陣列可以實現)。 3、陣列移動元素的過程中,要對元素進行大範圍的移動,很耗時間,效率也不高。

    C語言的程式碼記憶體佈局

    一個程式本質上都是由 BSS 段、data段、text段三個組成的。這樣的概念在當前的計算機程式設計中是很重要的一個基本概念,而且在嵌入式系統的設計中也非常重要,牽涉到嵌入式系統執行時的記憶體大小分配,儲存單元佔用空間大小的問題。 BSS段:在採用段式記憶體管理

    C語言學習筆記---malloc函式

                                                                                                malloc函式詳解 一、malloc函式標頭檔案: #include<stdli

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

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