鏈表的建立是一個動態程序,動態建立結點時要為其分配記憶體,所以在學習建立鏈表之前要復習一下關于動態分配的函式:
malloc函式:void*malloc(unsigned int)
作用:該函式的作用是在記憶體中動態的分配一塊size大小的記憶體空間,malloc函式會回傳一個指標該指標指向分配的記憶體空間,如果發生錯誤,則回傳NULL
calloc函式:void*calloc(unsigned n,unsigned size)
作用:該函式的作用是在記憶體中動態的分配n個長度為size大小的連續記憶體空間陣列,并對其進行初始化,該函式也會回傳一個指標,該指標指向動態分配的連續記憶體空間地址
free函式:void free(void*ptr)
作用: 釋放由malloc或calloc動態開辟指向的記憶體空間
下面我們就學習如何建立鏈表吧:
(關于鏈表的建立我已經詳細的寫在代碼注解里了,歡迎小伙伴們閱讀,指點😁😁)
//定義結點型別
struct student
{
char Name[20];
char iNumber[10];
struct student* pNext;
};
//定義一個全域變數記錄鏈表結點個數
int icount = 0;
//定義一個名為Create的函式,回傳值為struct student* 來及鏈表
struct student*Create()
{
//定義一個頭節點并將其重置為空
struct student* pHead = NULL;
//定義尾結點,新結點(即要添加的結點)
struct student* pEnd, * pNew;
//開辟一塊動態的記憶體空間,剛開始時使尾結點和新結點都指向這塊空間
pEnd = pNew = (struct student*)malloc(sizeof(struct student));
if (pNew!=NULL&&pEnd!=NULL)
{
//向新開辟的pNew空間中寫入第一組資料
scanf_s("%s", &pNew->Name[20], 20);
scanf_s("%s", &pNew->iNumber[10], 10);
}
while (pNew->Name!=0)
{
icount++;
//若為第一次寫入資料
if (icount == 1)
{
//第一次寫入資料則讓頭結點指向新結點的指標域
pNew->pNext = pHead;
//此時新結點即為尾結點
pEnd = pNew;
//此時新結點也為頭結點
pHead = pNew;
}
else
{
//則此時新結點不是第一個結點,則此時他的指標域指向空
pNew->pNext = NULL;
//使得原先的尾結點指標域指向新結點
pEnd->pNext = pNew;
//令新加入的結點為尾結點
pEnd = pNew;
}
//為pNew在重新開辟一塊記憶體空間用來存盤新的資料
pNew = (struct student*)malloc(sizeof(struct student));
if (pNew!=NULL)
{
//重新輸入下一組資料
scanf_s("%s", &pNew->Name[20], 20);
scanf_s("%s", &pNew->iNumber[10], 10);
}
}
//釋放開辟的空間
free(pNew);
//回傳鏈表的頭結點,通過頭結點就可以找到整個鏈表
return pHead;
}
(2020年12月20日,假期堅持打卡第二天,加油!)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/238127.html
標籤:其他
