//鍵盤輸入若干個整數,按輸入數據逆序建立一個帶頭結點的單鏈表(頭插入創建單鏈表)
#include<stdio.h>
#include<stdlib.h>
typedef struct Link {
int data;
struct Link* next;
}link;
//頭插入的方式初始化鏈表
link* initLink(link* head_node) {
head_node = (link*)malloc(sizeof(link)); //創建頭結點
head_node->data = 0; //頭結點數據域初始化賦值為0
head_node->next = NULL;
link* ptail = head_node;
//頭插入賦值
printf("輸入若干個值逆序保存到鏈表中:\n");
int num = 0;
while (num != -1) { //輸入-1就結束
scanf("%d", &num);
link* new_node = (link*)malloc(sizeof(link)); //申請一個新節點
new_node->data = num; //給新節點賦初值
new_node->next = head_node; //新節點的指針域是最后一個結點
head_node = new_node; //新節點成為最后一個結點(頭結點,頭結點在后面)
ptail = new_node; //尾指針指向這個新節點,不斷往前移動
}
printf("尾指針指向的值是:%d\n", head_node->next->data);
//return ptail; //將指向最后一個結點的尾指針返回
return head_node;
}
//遍歷鏈表(逆序建立,順序遍歷)
void showLink(link* head_node) {
link* tmp =head_node->next; //從頭結點的下一個結點,即第一個結點開始遍歷,避免輸出結束標志-1
while (tmp != NULL) {
//if (tmp->data == -1) {
// break; //順序遍歷,結束標志 -1不輸出不能這樣控制,否則一個都輸出不了
//}
printf("%d ", tmp->data);
tmp = tmp->next;
}
}
void main() {
link* myHeadNode = NULL;
myHeadNode = initLink(myHeadNode); //獲取經過初始化的頭結點
printf("逆序建立的鏈表為:\n");
showLink(myHeadNode);
}

0是頭結點中的值,可以不打印,遍歷時遍歷到 tmp->data ==0 ,退出遍歷即可。
