1. 程式人生 > >單鏈表的建立(靜態連結串列,動態連結串列)

單鏈表的建立(靜態連結串列,動態連結串列)

       連結串列是一種很重要的資料結構,在實際工作中也有著很多的應用,這次我們先討論一下最簡單的單鏈表

       關於單鏈表的操作有很多,當然最基本的就是要建立一個單鏈表,對於單鏈表來說,可以按照型別分為靜態連結串列動態連結串列

1.靜態連結串列

靜態連結串列指的是先確定節點個數,然後根據指定個數而建立的連結串列。既然是確定節點個數,我們首先要在程式中輸入一個需要建立的節點個數,然後根據這個需要建立的節點個數,來建立一個單鏈表。當然,為了驗證建立的連結串列的正確性,我們還需要再編寫一個遍歷列印連結串列節點的函式TraversalList。程式如下:

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

typedef struct Node
{
int member; //節點中的成員
struct Node *next;//指向下一個節點的指標
};

//建立單鏈表的函式
Node* CreateSList()
{
int i = 0; //迴圈計數
int length = 0;//連結串列長度
int value = 0;//儲存輸入的節點成員值

//建立連結串列頭節點並分配空間
Node* pHead = (Node*)malloc(sizeof(Node));
assert(pHead != NULL);

//建立臨時節點並分配空間,用於迴圈控制
Node* pTemp = (Node*)malloc(sizeof(Node));
assert(pHead != NULL);

//輸入需要建立的連結串列節點個數
printf("請輸入要建立的節點個數:");
scanf_s("%d", &length);

//迴圈建立連結串列節點
for (i = 0; i < length; i++)
{
//輸入每個節點的成員
printf("請輸入第%d個節點的成員:",i + 1);
scanf_s("%d", &value);

//建立一個新節點,並分配空間
Node* pNew = (Node*)malloc(sizeof(Node));


//將剛才輸入的節點成員賦給pNew節點
pNew->member = value;
//將pNew的下一個節點設定為NULL
pNew->next = NULL;


//如果是第一個連結串列節點
if (0 == i)
{
pHead = pNew; //將pNew節點賦給頭節點
pHead->next = NULL;//設定頭節點的下一個節點為NULL
pTemp = pHead;//將頭結點賦給臨時節點,用於後面的迴圈控制
}
//不是第一個節點
else
{
pTemp->next = pNew;//將pNew賦給pTemp節點的下一個節點
pTemp = pTemp->next;//將pTemp指向pTemp的下一個節點
pTemp->next = NULL; //將pTemp的下一個節點的下一個節點設定為NULL
}
}
return pHead;//返回頭節點
}

//遍歷列印連結串列的函式
void TraversalSList(Node* pHead)
{
Node* pTemp = pHead;//將頭節點的指標賦給臨時節點pTemp
int i = 0; //迴圈時列印節點個數的控制變數
while (NULL != pTemp)   //若節點pTemp不為空,則迴圈
{
printf("第%d個節點資訊:\n", i + 1);
printf("第%d個節點的成員值為:%d\n",i + 1,pTemp->member);
//節點數累加
i++;
//將pTemp指向pTemp的下一個節點
pTemp = pTemp->next;
}
return;
}

//主函式
int main()
{
Node* pHead = NULL;//建立連結串列的頭結點,並初始化為NULL
pHead = CreateSList();//呼叫CreateSList函式建立單鏈表
printf("\n開始列印全部節點:\n");
TraversalSList(pHead);//呼叫TraversalSList函式遍歷列印單鏈表
return 0;
}

      編譯結果如下(編譯環境是Visual Studio 2013):


       通過結果可以看到,我們需要首先輸入一個節點個數(5),然後根據這個個數進行for迴圈,來依序建立各個節點,通過TraversalSList函式來遍歷列印,驗證建立的正確性。

2.動態連結串列

       相對於靜態連結串列的“確定節點個數”,動態連結串列則是沒有確定的節點個數,需要在建立過程中根據一些特定條件(例如節點中成員的值為空則不再建立)而控制建立。這種形式的使用場景包括播放器的播放列表管理(例如Ubuntu作業系統自帶的totem視訊播放器的播放列表就是通過動態單鏈表管理的,當檔名稱為空時,則不再建立)。建立動態連結串列時,就無需再先輸入一個節點個數了,而是在建立過程中根據建立條件建立,只要符合條件,則是一直建立,否則退出建立並列印。這次我們在程式中設定的建立節點條件是節點的成員不為0。程式如下:

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

typedef struct Node
{
int member; //節點中的成員
struct Node *next;//指向下一個節點的指標
};

//建立單鏈表函式
Node* CreateSList()
{
int i = 0;
int length = 0;
int value = 0;
Node* pHead = (Node*)malloc(sizeof(Node));
Node* pTemp = (Node*)malloc(sizeof(Node));
Node* pNew = (Node*)malloc(sizeof(Node));
printf("請輸入第1個節點的成員:");
scanf_s("%d", &pNew->member);
if (0 == pNew->member)
{
printf("第一個節點的成員就是0,故無法建立該連結串列!\n");
return NULL;
}
 

//while迴圈,當節點成員不為0時建立
while (0 != pNew->member)
{
if (0 == i)
{
pHead = pNew;
pHead->next = NULL;
pTemp = pHead;
}
else
{
pTemp->next = pNew;
pTemp = pTemp->next;
pTemp->next = NULL;
}

i++;

pNew = (Node*)malloc(sizeof(Node));

printf("請輸入第%d個節點的成員:", i + 1);
scanf_s("%d", &pNew->member);
}

printf("第%d個節點的成員為0,故該連結串列長度為%d\n", i + 1, i);


return pHead;
}

void TraversalSList(Node* pHead)
{
Node* pTmp = pHead;//將頭節點的指標賦給臨時節點pTemp
int i = 0; //迴圈時列印節點個數的控制變數
while (NULL != pTmp)   //節點p不為空,迴圈
{
printf("第%d個節點資訊:\n", i + 1);
printf("第%d個節點的成員值為:%d\n", i + 1, pTmp->member);
i++;
pTmp = pTmp->next;
}
return;
}

int main()
{
Node* pHead = NULL;
pHead = CreateSList();
printf("\n開始列印全部節點:\n");
TraversalSList(pHead);
return 0;
}

      編譯結果如下(編譯環境是Visual Studio 2013):


        通過結果可以看到,由於動態連結串列建立時事先不知道節點個數,所以需要使用while迴圈,條件是節點的成員不為0,來依序建立各個節點,當輸入節點成員為0時,則跳出while迴圈建立,然後通過TraversalSList函式來遍歷列印,驗證建立的正確性。

        以上只是個人的一些意見和理解,還請各位多多指教。

相關推薦

單鏈建立(靜態連結串列動態連結串列)

       連結串列是一種很重要的資料結構,在實際工作中也有著很多的應用,這次我們先討論一下最簡單的單鏈表。        關於單鏈表的操作有很多,當然最基本的就是要建立一個單鏈表,對於單鏈表來說,可以按照型別分為靜態連結串列和動態連結串列。 1.靜態連結串列 靜態連結串

(轉)靜態編譯動態編譯靜態連結動態連結

1.定義 LIB檔案中包含函式程式碼本身,在編譯時直接將程式碼加入程式當中。稱為靜態連結庫static link library。 LIB包含了函式所在的DLL檔案和檔案中函式位置的資訊(入口),程式碼由執行時載入在程序空間中的DLL提供,稱為動態連結庫dynamic link libr

靜態編譯動態編譯靜態連結動態連結

1.定義 LIB檔案中包含函式程式碼本身,在編譯時直接將程式碼加入程式當中。稱為靜態連結庫static link library。 LIB包含了函式所在的DLL檔案和檔案中函式位置的資訊(入口),程式碼由執行時載入在程序空間中的DLL提供,稱為動態連結庫dynamic li

單鏈雙向連結串列迴圈連結串列

  資料結構: 定義: 特定的資料型別(個體)和特定的儲存結構(個體的關係) 資料如何儲存在記憶體中 分類: 線性結構: 資料元素之間存在一對一的線性關

線性(陣列、單鏈靜態連結串列、迴圈連結串列、雙向連結串列

線性表的定義 線性表(List):零個或多個數據元素的有限序列。 有幾個地方需要強調: 首先它是一個序列,也就是說元素之間是有順序的,若元素存在多個,則第一個元素無前驅,最後一個元素無後繼,其他每個元素都有且只有一個前驅和後繼。 然後線性表強調的是有限的。 最

資料結構——線性 (順序單鏈靜態連結串列、迴圈連結串列、雙向連結串列

提示:以下內容不適合零基礎人員,僅供筆者複習之用。 一、線性結構的基本特徵: 1.集合中必存在唯一的一個“第一元素”; 2.集合中必存在唯一的一個 “最後元素”; 3.除最後元素在外,均有 唯一的後繼; 4.除第一元素之外,均有 唯一的前驅。 如:j

約瑟夫環——靜態迴圈連結串列動態迴圈連結串列

靜態迴圈連結串列 struct node{ int flag; int next; }arr[11]; #include"stdio.h" #include"stdlib.h" #include"s.h" main(){ int

【C】利用單鏈資料結構實現通訊錄連結串列的增刪改查

C語言中實現連結串列,是需要利用到C語言中比較難的結構體與指標才能實現。 結構體中放一個指向後接節點的指標與每一個結點應該存放的資訊。 下面做一個命令列的通訊錄來說明連結串列的增刪改查這個問題。 一開始讓使用者輸入連結串列,按1可以輸出,按3可以刪除。 可以修改: 可以

資料結構之線性(順序單鏈迴圈連結串列雙向連結串列)-- 圖書管理系統

順序表 #include <iostream> #include <cstring> #include <cstdlib>///exit()標頭檔案exit(0):正常執行程式並退出程式。exit(1):非正常執行導致退出程式 #incl

關於原始檔標頭檔案,靜態連結庫檔案動態連結庫檔案的的理解

先從原始檔和標頭檔案的關係說起,由於是還是初學階段,只接觸了C++語言和windows平臺下的程式設計,所以只講這兩方面的東東, 標頭檔案的作用:對函式,變數,和類的宣告,其實在標頭檔案也可對一些特殊函式和變數定義,比如可以在標頭檔案中對行內函數和const型別變數定義,由於對類的宣告

Linux中.a和.so其實就是靜態連結庫與動態連結

詳細查了一下,.a與.so的區別,其實就是靜態連結庫與動態連結庫。有一篇博文,很詳細,附上鍊接:http://blog.csdn.net/nieyinyin/article/details/6890557   Linux下的.so是基於Linux下的動態連結,其功能和作用類

原始檔標頭檔案,靜態連結庫檔案動態連結庫檔案的的理解

如果你把一個.exe檔案只接放到沒有操作系充的“裸機”上去執行,顯然是執行不了的,可是你把這個程式放在一個裝有windows系統的電腦上就能運行了,顯然,程式的執行還是得依靠windows作業系統,這裡就要說到.dll檔案,上面說到的連結這一步時的程式碼複製只講到對程式作者自已寫的檔案和.lib檔案中用到的程

單鏈的整建立--頭插法尾插法

建立單鏈表的過程是一個動態生成連結串列的過程。應依次建立各個結點,並逐個插入連結串列 給出頭插法 //隨機產生n個元素的值,建立代表頭結點的單鏈線性表L(頭插法) void CreateListHead(LinkList * L,int n) { LinkList p;

【練習題】編寫打印出一個單鏈的所有元素的程式【連結串列

只是實現了連結串列ADT的部分功能。 /*---編寫打印出一個單鏈表的所有元素的程式---*/ #include <stdio.h> #include <stdlib.h> struct Node{ int val; struct Node *

C++寫的帶有頭結點單鏈建立插入刪除顯示

#include<iostream> usingnamespacestd; structlink { chardata; structlink*next; }; link*head,*tail;//建立頭指標和尾指標 intcreat(); /******

Java實現單鏈的插入、刪除、計算連結串列的長度和輸出連結串列

首先定義單鏈表(以下統稱為連結串列): 連結串列有兩部分:資料和指向下一個節點的指標。 這裡引用書中的一張圖片: 一般是知道頭指標,然後根據頭指標做插入、刪除、反轉、排序、輸出等操作。 使用Java實現連結串列的結構如下: /** * 連結串列的

單鏈的增刪查改,以及雙向連結串列的有關操作

 最近在回顧線性儲存結構-鏈式儲存有關的操作,到現在基本上覆習完畢,整理相關程式碼如下: #include <stdio.h> #include <stdlib.h> #include <strings.h> struct node{

單鏈建立插入刪除

學程式設計的小菜鳥一枚,希望未來好好學習天天向上~ 歡迎各位大神前來指正~ 放上資料結構的初次作業^_^(其實。。只做了一部分(°-°)) 以下函式在VC6.0的環境中執行通過 //定義結構體 typedef struct link { int

單鏈建立逆序刪除

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

數據結構(05)_單鏈單鏈靜態單鏈、單向循環鏈

traverse 註意 簡單 過多 輔助 最終 一次 des code 21.線性表的鏈式存儲結構 21.1.鏈式存儲的定義: 為了表示每個數據元素與其直接後繼之間的邏輯關系,數據元素除過存儲本身的信息之外,還需要存儲其後繼元素的地址信息。鏈式存儲結構的邏輯結構: 數據域