單鏈表的生成有2種方式:頭插法和尾插法。
1、頭插法
/**********************************************************************?函數名稱:linklist?*CreateLinklistHead()
*?函數功能:利用頭插法創建鏈表
*?參數:無
*?返?回?值:創建完鏈表後的鏈表頭結點
*?說明:無
*********************************************************************/
extern?linklist?*CreateLinklistHead()
{
int?x,?i,?nodeNum;
linklist?*head,?*temp;?//?頭結點與臨時結點
head?=?(linklist?*)malloc(sizeof(linklist));?//?生成表頭結點
head->next?=?NULL;//?給表頭結點的指針域賦值
printf("請輸入鏈表中結點的個數:");
scanf("%d",?&nodeNum);
for(i=1;?i<=nodeNum;?i++)
{
printf("請輸入第?%d?個結點的數據:",?i);
scanf("%d",?&x);
temp?=?(linklist?*)malloc(sizeof(linklist));?//?生成新的結點
temp->data?=?x;//?對新結點的數據域賦值
//?將新結點插到頭結點之後
temp->next?=?head->next;?
head->next?=?temp;
}
return?head;?//?返回新建鏈表的頭結點
}
2、尾插法
/**********************************************************************?函數名稱:linklist?*CreateLinklistRear()
*?函數功能:利用尾插法創建鏈表
*?參數:無
*?返?回?值:創建完鏈表後的鏈表頭結點
*?說明:無
*********************************************************************/
extern?linklist?*CreateLinklistRear()
{
int?x,?i,?nodeNum;
linklist?*head,?*rear,?*temp;?//?定義頭結點、尾結點和臨時結點
head?=?(linklist?*)malloc(sizeof(linklist));?//?生成表頭結點,表頭結點不存放數據
head->next?=?NULL;?//?將表頭結點的指針域賦值為NULL
rear?=?head;?//?將表頭結點賦值給表尾結點
printf("請輸入鏈表中結點的個數:");
scanf("%d",?&nodeNum);
for(i=1;?i<=nodeNum;?i++)
{
printf("請輸入第?%d?個結點的數據:",?i);
scanf("%d",?&x);
temp?=?(linklist?*)malloc(sizeof(linklist));?//?生成新的結點
temp->data?=?x;//?新增結點的數據域
temp->next?=?NULL;?//?新增結點的指針域(由於是尾插法,所以插入的結點都在尾部,即指針域為NULL)
rear->next?=?temp;?//?使前壹個結點指向新增結點(head->next=temp)
rear?=?temp;?//?將新增結點賦值給尾結點(尾插法,插入的結點在尾部)(rear=head->next)
}
//rear->next?=?NULL;?//?將尾結點的指針域賦值為空(為了方便檢驗鏈表是否為空鏈表)
return?head;?//?返回頭結點
}