我是看着【C語言】帶你學C帶你飛和《啊哈!算法》學習的,建議看看鏈表這章
【C語言】《帶你學C帶你飛》(小甲魚)
鏈表,指針!
結構體可不可以這樣
struct Test{
int x;
int y;
struct Test test;
};
哦這顯然是不行的,這樣會陷入無限循環,test的結構體又會指向自己,再次指向,就成了沒有出口的遞歸,但是有一種方法可以解決!
struct Test{
int x;
int y;
struct Test *test;
};
📖這是什麼?指針?對就是指針!牛逼吧,一個星號解決問題!但是有沒有一個指向自身的數據結構呢?別說,還真有,那就是鏈表!
鏈表中最簡單的就是單鏈表,鏈表是使用指針連接在一起的,所以內存不需要緊密連接,所以比較鬆散,鏈表重一個節點的結構是一個信息域和指針域,信息域就是存儲信息的,指針域是指向下一個節點的
指着指着,最後指向NULL結束,顯然還需要一個頭指針指向第一個節點
下一步,在鏈表中插入一個新的元素,只需要確定要插在哪裏,然後將原本的指針先拿開指向新來的節點,再將新來的節點指向原本的後一個節點就可以,這叫做頭插法
好,我們先構造一個簡單的只能輸入的傻鏈表
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct List
{
int data;
struct List *next;
}; //構建鏈表
void getInput(struct List *book)
{
printf("輸入數據:");
scanf("%s", book->data);
}
void addData(struct List **head)
{
struct List *list, *temp;
list = (struct List *)malloc(sizeof(struct List));
//動態分配內存
//檢測內存是否分配失敗
if (list == NULL)
{
printf("內存分配失敗了\n");
exit(1);
}
getInput(list);
if (*head != NULL)
{ //非空鏈表插入
temp = *head;
*head = list;
list->next = temp;
}
else
{ //空鏈表插入
*head = list;
list->next = NULL;
}
return;
}
int main()
{
struct List *head;
head = NULL;
addData(&head);
return 0;
}
現在分析,我說的不全面可以看視頻,首先需要頭指針head,指向NULL,意味着空鏈表,下面執行addData函數,給頭指針的地址,然後我們需要動態給list分配內存,list是主鏈吧,如果malloc崩了,那麼if語句就會異常退出,再次輸入數據,例如輸入一個123,如果非空鏈表需要用臨時變量保存頭指針,然後將next指向臨時變量,***就行了,空鏈表不需要臨時變量,就可以
下面可以輸出鏈表:
void printList(struct List * head)
{
struct List * list;
int count = 1;
list = head; //將頭指針給鏈表
while (list != NULL)
{
printf("id:%d", count);
printf("data:%d\n", list->data);
list = list->next; //賦值爲下一個節點
count++; //計數器加一
}
}
大家可以使用free釋放空間,如果鏈表不等於NULL就是不爲空,就一直循環!
SRC
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct List
{
int data;
struct List *next;
}; //構建鏈表
void getInput(struct List *book)
{
printf("輸入數據:");
scanf("%s", book->data);
}
void addData(struct List **head)
{
struct List *list, *temp;
list = (struct List *)malloc(sizeof(struct List));
//動態分配內存
//檢測內存是否分配失敗
if (list == NULL)
{
printf("內存分配失敗了\n");
exit(1);
}
getInput(list);
if (*head != NULL)
{ //非空鏈表插入
temp = *head;
*head = list;
list->next = temp;
}
else
{ //空鏈表插入
*head = list;
list->next = NULL;
}
return;
}
void printList(struct List * head)
{
struct List * list;
int count = 1;
list = head; //將頭指針給鏈表
while (list != NULL)
{
printf("id:%d", count);
printf("data:%d\n", list->data);
list = list->next; //賦值爲下一個節點
count++; //計數器加一
}
}
int main()
{
struct List *head;
head = NULL;
addData(&head);
addData(&head);
addData(&head);
printList(head);
return 0;
}