/*
目的:創建一個單鏈表,實現尾部插入,頭部插入,遍歷鏈表
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//定義一個結構體,用來表示一個節點,包含指針域,數據域
struct node
{
int data; //數據域
struct node *next; //指針域,指向節點的指針,用來連接兩個節點
};
//定義一個函數,用來創建節點,為節點分配堆內存,由於堆內存殘留有隨機值,創建成功後清空內存
//函數的返回值需要是struct node *類型,因為創建了一個節點,要操作這個節點,就需要得到這個節點的地址信息
struct node *create_node(int data) //int data :為節點的數據域傳值
{
struct node *p = (struct node *)malloc(sizeof(struct node)); // 創建一個節點,並返回其地址值保存到 p 中
if(NULL == p) //判斷節點是否成功創建
{
printf("malloc erro");
return NULL;
}
bzero(p,sizeof(struct node)); //調用#include <string.h>中的函數,功能是清理申請的髒內存
//節點創建成功並清理後,就填充節點
p -> data = data;
p -> next = NULL;
return p; //返回節點的地址值
}
//尾部插入函數的實現:通過頭指針找到最後一個節點,再將新節點與最後一個節點關聯,插入完成;
void insert_tail(struct node *pHeader,struct node *new)
{
//接收頭指針的值,開始遍歷鏈表,找到尾節點
struct node *p = pHeader;
while(NULL != p -> next) //遍歷鏈表,找到尾節點
{
p = p -> next;
}
//遍歷結束,找到最後一個節點就是p
//將新節點的地址值放入最後一個節點的指針域
p -> next = new; //尾部插入成功
new -> next = NULL;
}
//頭部插入函數的實現:先將第一個節點的地址值放入新節點的指針域,再將新節點的地址放入頭節點的指針域
void insert_head(struct node *hNode,struct node *new)
{
if(NULL == hNode -> next)
{
hNode -> next = new;
new -> next = NULL;
}
else
{
new -> next = hNode -> next;
hNode -> next = new;
}
}
int main(void)
{
struct node *pHeader = create_node(0);
insert_head(pHeader,create_node(1));
insert_head(pHeader,create_node(2));
insert_head(pHeader,create_node(3));
insert_head(pHeader,create_node(4));
printf("*********************************頭部插入********************************\n");
printf("node 1:%d.\n",pHeader -> next -> data);
printf("node 2:%d.\n",pHeader -> next ->next -> data);
printf("node 3:%d.\n",pHeader -> next -> next ->next ->data);
printf("node 4:%d.\n",pHeader -> next ->next ->next ->next -> data);
/***********************************************************************************************/
struct node *pH = create_node(0);
insert_tail(pH,create_node(1));
insert_tail(pH,create_node(2));
insert_tail(pH,create_node(3));
insert_tail(pH,create_node(4));
printf("*********************************尾部插入********************************\n");
printf("node 1:%d.\n",pH -> next -> data);
printf("node 2:%d.\n",pH -> next ->next -> data);
printf("node 3:%d.\n",pH -> next -> next ->next ->data);
printf("node 4:%d.\n",pH -> next ->next ->next ->next -> data);
return 0;
}