1. 程式人生 > >c語言連結串列詳解(超詳細)

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

連結串列是一種常見的基礎資料結構,結構體指標在這裡得到了充分的利用。連結串列可以動態的進行儲存分配,也就是說,連結串列是一個功能極為強大的陣列,他可以在節點中定義多種資料型別,還可以根據需要隨意增添,刪除,插入節點。連結串列都有一個頭指標,一般以head來表示,存放的是一個地址。連結串列中的節點分為兩類,頭結點和一般節點,頭結點是沒有資料域的。連結串列中每個節點都分為兩部分,一個數據域,一個是指標域。說到這裡你應該就明白了,連結串列就如同車鏈子一樣,head指向第一個元素:第一個元素又指向第二個元素;……,直到最後一個元素,該元素不再指向其它元素,它稱為“表尾”,它的地址部分放一個“NULL”(表示“空地址”),連結串列到此結束。

作為有強大功能的連結串列,對他的操作當然有許多,比如:連結串列的建立,修改,刪除,插入,輸出,排序,反序,清空連結串列的元素,求連結串列的長度等等。

初學連結串列,一般從單向連結串列開始

--->NULL
head

這是一個空連結串列。

 ---->[p1]---->[p2]...---->[pn]---->[NULL]
head   p1->next  p2->next   pn->next

有n個節點的連結串列。

建立連結串列

typedef struct student{
	int score;
	struct student *next;
} LinkList;

一般建立連結串列我們都用typedef  struct,因為這樣定義結構體變數時,我們就可以直接可以用LinkList  *a;定義結構體型別變量了。

初始化一個連結串列,n為連結串列節點個數。

LinkList *creat(int n){
	LinkList *head, *node, *end;//定義頭節點,普通節點,尾部節點;
	head = (LinkList*)malloc(sizeof(LinkList));//分配地址
	end = head;         //若是空連結串列則頭尾節點一樣
	for (int i = 0; i < n; i++) {
		node = (LinkList*)malloc(sizeof(LinkList));
		scanf("%d", &node->score);
		end->next = node;
		end = node;
	}
	end->next = NULL;//結束建立
	return head;
}

修改連結串列節點值

修改連結串列節點值很簡單。下面是一個傳入連結串列和要修改的節點,來修改值的函式。

void change(LinkList *list,int n) {//n為第n個節點
	LinkList *t = list;
	int i = 0;
	while (i < n && t != NULL) {
		t = t->next;
		i++;
	}
	if (t != NULL) {
		puts("輸入要修改的值");
		scanf("%d", &t->score);
	}
	else {
		puts("節點不存在");
	}
}

刪除連結串列節點

刪除連結串列的元素也就是把前節點的指標域越過要刪除的節點指向下下個節點。即:p->next = q->next;然後放出q節點的空間,即free(q);

void delet(LinkList *list, int n) {
	LinkList *t = list, *in;
	int i = 0;
	while (i < n && t != NULL) {
		in = t;
		t = t->next;
		i++;
	}
	if (t != NULL) {
		in->next = t->next;
		free(t);
	}
	else {
		puts("節點不存在");
	}
}

插入連結串列節點

我們可以看出來,插入節點就是用插入前節點的指標域連結上插入節點的資料域,再把插入節點的指標域連結上插入後節點的資料域。根據圖,插入節點也就是:e->next = head->next;  head->next = e;

增加連結串列節點用到了兩個結構體指標和一個int資料。

void insert(LinkList *list, int n) {
	LinkList *t = list, *in;
	int i = 0;
	while (i < n && t != NULL) {
		t = t->next;
		i++;
	}
	if (t != NULL) {
		in = (LinkList*)malloc(sizeof(LinkList));
		puts("輸入要插入的值");
		scanf("%d", &in->score);
		in->next = t->next;//填充in節點的指標域,也就是說把in的指標域指向t的下一個節點
		t->next = in;//填充t節點的指標域,把t的指標域重新指向in
	}
	else {
		puts("節點不存在");
	}
}

輸出連結串列

輸出連結串列很簡單,邊遍歷邊輸出就行了。

        while (h->next != NULL) {
		h = h->next;
		printf("%d  ", h->score);
	}