從零開始的c語言連結串列學習 001--建立一個最簡單基礎的連結串列
阿新 • • 發佈:2018-12-17
因為各種原因,儘管c語言期末考也拿了八十多分,卻仍然對連結串列處在完全甍逼的狀態,以至於之後的資料結構課聽天書,實驗課做不出來,於是決定重學一波連結串列的知識,特此記錄筆記
001—建立一個簡單的連結串列
1.1 認識連結串列 所謂連結串列,一言蔽之就是一連串帶有指標的結構體,像XX蜈蚣一樣連在一起。(嗯我就是覺得連結串列有這麼噁心)
其基本元素是一個結構體變數,其中包含了一些資料及一個與結構體同種型別的指標。因為連結串列的每個結點都是隨機分散在記憶體中的(這是連結串列對於陣列在一些方面的優勢),這個指標就是用來聯絡上下,將他們串在一起的連線部。 例如:
typedef struct node { int data; //用於存放資料 struct node *next; //這個就是連線部,用於尋找下一個結點 }Node,*Pnode; //如果我沒理解錯的話,*Pnode就是Node *的別名,專門用來建立指標,不用再多打一個*號;
PS:為什麼連線部是一個同種的結構體指標? —>必須同種類指標才能指向同種類變數,例如int型別的指標不能指向double型別的變數,因為他們的記憶體大小不同。這裡就是這個原因。至於如果想不明白為什麼我明明在定義結構體,卻在內部又用到了它,我建議不要糾結這個問題,先照著用比較好。。。
1.2 開始建立最簡單的連結串列吧
先看一眼這個函式:
Node *create(int len) { Pnode head=NULL,tail=NULL,temp=NULL; int i; printf("let's create it ! \n"); head=(Node *)malloc(sizeof(Node)); //給頭結點分配空間,若失敗則報錯 if(!head) { printf("error"); exit(-1); } head->next=NULL; printf("enter your data\n"); for(i=0;i<len;i++) { temp=(Node *)malloc(sizeof(Node)); //正式開始建立,為每一個結點分配 if(!temp) { printf("error"); exit(-1); } //如果你想建立一個更簡單的連結串列,可以把scanf輸入改成固定的輸入,如: // temp->data=i*5; scanf("%d",&temp->data); //這裡temp->data相當於一個普通的int 型別變數,需要加& temp->next=NULL; //先把沒指向的指標指空,避免出現野指標 if(!head->next) //當頭部指向為空時條件成立,將頭部與結點相連(即建立第一個結點的情況) { head->next=temp; } else //之後每個結點都從尾部連結 { tail->next=temp; } tail=temp; //新的尾部 } return head; //將頭返回 }
- 這個函式用的是一種非常簡單的建立一個連結串列的方法,連結串列的長度直接由引數len決定,最後返回連結串列的頭指標
- 首先被創建出來的是三個指標,分別代表指標的頭部,尾部,和一個“臨時”指標
- 頭部就是連結串列的頭,作為大哥先要給它分配好空間,方便留作後面牽頭使用。
- 然後就是正式開始建立主體了,簡單來講就是臨時工temp不斷的從malloc處申請和搬運空間,然後和head或tail一起把它們像火車車廂一樣一節節連起來。
搬運出來的空間都已經是結構體的形狀了,可以讓tail和head直接使用 - 之後這裡有一個“分歧”(if,else),這個空間以什麼方式加入連結串列?因為這裡我們想要從尾部插入,所以除了第一個還要用來和牽頭大哥head聯絡外,所有結點都“給”tail。這樣,每次建立的結點都由temp搬運過來,並讓舊的尾巴與他相連,讓他成為新的(
巫妖王
這樣,我們就建立了一個最最簡單的連結串列了,之後只要把頭返回出去,就可以通過這個頭指標,牽出一整條連結串列。
這一篇的內容就是這樣了w,個人小筆記
下面是完整的程式碼:
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}Node,*Pnode; //*Pnode相當於Node *
Node *create(int len)
{
Pnode head=NULL,tail=NULL,temp=NULL;
int i;
printf("let's create it ! \n");
head=(Node *)malloc(sizeof(Node)); //給頭結點分配空間,若失敗則報錯
if(!head)
{
printf("error");
exit(-1);
}
head->next=NULL;
printf("enter your data\n");
for(i=0;i<len;i++)
{
temp=(Node *)malloc(sizeof(Node)); //正式開始建立,為每一個結點分配
if(!temp)
{
printf("error");
exit(-1);
}
//temp->data=i*3;
scanf("%d",&temp->data); //這裡temp->data相當於一個普通的int 型別變數,需要加&
temp->next=NULL; //先把沒指向的指標指空,避免出現野指標
if(!head->next) //當頭部為空時條件成立,將頭部與結點相連(即建立第一個結點的情況)
{
head->next=temp;
}
else //之後每個結點都從尾部連結
{
tail->next=temp;
}
tail=temp; //新的尾部
}
return head; //將頭返回
}
int main()
{
int len;
Pnode head;
printf("hello! \n");
printf("how many do you want? \n");
scanf("%d",&len);
head=create(len);
printf("this is all : \n");
while(head->next!=NULL)
{
printf("%d ",head->next->data);
head=head->next;
}
return 0;
}