1. 程式人生 > >從零開始的c語言連結串列學習 001--建立一個最簡單基礎的連結串列

從零開始的c語言連結串列學習 001--建立一個最簡單基礎的連結串列

因為各種原因,儘管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;
}