天天看點

【C語言】連結清單的使用及連結清單的實作原理

🚀 作者 :“大資料小禅”

🚀 粉絲福利 :加入小禅的大資料社群

🚀 歡迎小夥伴們 點贊👍、收藏⭐、留言💬

連結清單是什麼?

1.邏輯結構上⼀個挨⼀個的資料,在實際存儲時,并沒有像順序表那樣也互相緊挨着。恰恰相

反,資料随機分布在記憶體中的各個位置,這種存儲結構稱為線性表的鍊式存儲。

2.由于分散存儲,為了能夠展現出資料元素之間的邏輯關系,每個資料元素在存儲的同時,要

配備⼀個指針,⽤于指向它的直接後繼元素,即每⼀個資料元素都指向下⼀個資料元素

** 本身的資訊,稱為“資料域” **

** 指向直接後繼的指針,稱為“指針域”。指向NULL(空))。

下面是一個單連結清單的實作過程

#include <stdio.h>
#include <stdlib.h>
#include <string.h>                 //結構體是⼀種⼯具,⽤這個⼯具可以定義⾃⼰的資料類型
typedef struct
{
 char Num[10];//學号
 char Name[20];//姓名
} Student;

typedef struct tagNode                  
{                                        
 Student Stu;                       
 struct tagNode *pNext;         
} Node;

//定義連結清單的第⼀個學⽣,即學⽣單連結清單的頭結點

Node *head = NULL;  
void printfNode()                                           //周遊元素
{
 Node *node = head;   //為了不去破壞那個本來的head,重新定義一個node指針變量。
 while(node !=NULL)
 {
 printf("Num:%s,Name:%s\n",node->Stu.Num,node->Stu.Name);
 node = node->pNext;    //node等于下一個節點,一直周遊下去
 }
}

void addNode(Node *node)      
{                
 node->pNext = NULL;    //如果隻是一個Node,那就是一個元素,你隻知道他的資料,并不知道怎麼去通路這個資料
    
 if(head == NULL)
 {
 head = node;    //一開始沒有任何節點,那麼傳入的節點作為頭結點
 }
    
 else
 {
 Node *p = head;                          
     
 while(p != NULL && p->pNext !=NULL)       //,擷取最後一個節點的位置,跳出循環的那時候是最後一個節點,判斷後繼節點是否為空
 {
 p = p->pNext;
 }
 p->pNext=node;      //下一個指針域指向新節點

 }
}

int main()
{
 Node *p1 = (Node*)malloc(sizeof(Node));    //malloc在 <stdlib.h> 裡面,給p1配置設定一個記憶體。  這裡p1換成node輸出一樣
 strcpy(p1->Stu.Num,"123");    //給p1指派
 strcpy(p1->Stu.Name,"louis");
 Node *p2 = (Node*)malloc(sizeof(Node));
 strcpy(p2->Stu.Num,"124");
 strcpy(p2->Stu.Name,"daniel");
 Node *p3 = (Node*)malloc(sizeof(Node));
 strcpy(p3->Stu.Num,"125");
 strcpy(p3->Stu.Name,"xd");
 addNode(p1);
 addNode(p2);
 addNode(p3);
 printfNode();
 return 0;
}

輸出:

Num:123,Name:louis
Num:124,Name:daniel
Num:125,Name:xd
      
【C語言】連結清單的使用及連結清單的實作原理

繼續閱讀