#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int data;
struct Node *next;
}Node;
Node *CreatH(); //尾插法建立鏈表
Node * CreatH1(); // 頭插法建立鏈表
void Show(Node *); //輸出鏈表
void Ease(Node *); //鏈表釋放
int main(void)
{
Node *Head, *Head1;
Head = CreatH();
Show(Head);
Head1 = CreatH1();
Show(Head1);
Ease(Head);
return 0;
}
Node *CreatH() //尾插法
{
int x;
Node *Head;
Head = (Node *)malloc(sizeof(Node));
Head->next=NULL; //初始化
Node *r; //尾指針
r = Head; //尾指針始終要指向最后一個結點,即最新創建的那個結點。
while(scanf("%d", &x)!=EOF){
Node *p = (Node *)malloc(sizeof(Node));
p->data = x;
r->next = p; //將p連接到鏈表末尾
r = p; //r指向新的鏈表末尾
}
r->next=NULL;
return Head;
}
Node * CreatH1() //頭插法建立鏈表
{
int x;
Node *Head; //頭指針
Node *p;
Head = (Node *)malloc(sizeof(Node)); //頭結點
Head->next=NULL;
while(scanf("%d", &x)!=EOF){
p = (Node *)malloc(sizeof(Node));
/*
申請新結點
一定不能這樣寫:Node p;
不可以直接定義一個結構體,如果這樣,建立的鏈表在代碼塊結束后就會被釋放掉。
必須動態分配一塊內存,然后定義一個指針指向。
*/
p->data = x;
p->next = Head->next;
Head->next = p;
}
return Head;
}
void Show(Node *Head) //輸出鏈表
{
Node *p;
p = Head->next; //不可以是 P = Head;
while(p!=NULL){ // while(p->Head!=NULL) 這樣寫的話,最后一個結點的數據就無法讀取到。
printf("%d ", p->data);
p = p->next;
}
printf("\nend\n");
return ;
}
void Ease(Node *Head) //釋放鏈表,背下來就行。
{
Node *p;
while(Head!=NULL){
p = Head;
Head = Head->next;
free(p);
}
return ;
}