常用的鏈表/堆棧 都是先 生成一個頭指針head 再用頭指針 申請一個 頭節點空間,然后 頭節點 的Data 一般是不儲存數據的 ,
{ 當用 malloc函數分配內存后head就變為了名叫head的節點了。而不在是一個單獨的指針了 }
{ 注意只要用malloc申請的空間 才能使 指針再 下次循環 指向不同的 內存空間 ,即每次申請的內存 地址都是一定不相同的,除非free了 這個內存空間,否則不可能再次被使用 }
當為鏈表/堆棧 為空時 則頭節點 head->Next=NULL;否則則指向會儲存 數據的普通節點;(這樣實現的鏈表/堆棧 的空類型 判斷 打印操作都比較方便)
【帶頭節點(不存放普通數據得)的引入是為了對鏈表刪除、逆向、建立的時候操作更統一,不用專門對第一個元素單獨處理。】
3、大部分程序用帶頭節點來存儲鏈表的長度。
4、如何區分,很簡單,看看程序的定義,和程序在建立鏈表的時候有沒針對第一個節點做特殊處理。(做了特殊處理的,則說明頭節點儲存了數據/即沒有頭節點 ,只要頭指針)
- 鏈表(先入先出)
//說明的更加詳細的博文-> https://blog.csdn.net/endeavor_g/article/details/80552680
#include<stdio.h> #include <stdlib.h> /*鏈表*/ typedef int ElementType; typedef struct Node *PtrToNode; struct Node { ElementType Data; PtrToNode Next; }; typedef PtrToNode List;//List是一個 struct Node 指針 List Merge( List L1, List L2 ); List Read(); /* 細節在此不表 */ void Print( List L ); /* 細節在此不表;空鏈表將輸出NULL */ int main(){ List L1,L2,L; L1 = Read(); L2 = Read(); // Print(L1); // Print(L2); L=Merge( L1, L2 ); printf("\n------\n"); Print(L); Print(L1); Print(L2); } List Read() { List r,L=(struct Node*)malloc(sizeof(struct Node));//這個空頭節點的創建相當於創建了 鏈表對象; L->Next=NULL;//創建一個頭節點;一般鏈表都是帶頭節點的;頭節點的 Data是沒有存放數據的 ;當然也可以創建沒有頭節點的鏈表; //因為帶有頭節點的 鏈表,可以讓print操作更加簡練;因此鏈表都是有一個 不存放數據的頭節點的; 【鏈表】 r=L; int n; scanf("%d",&n); while(n--) {///尾插法 Node *p=(struct Node*)malloc(sizeof(struct Node)); scanf("%d",&p->Data); p->Next=NULL; r->Next=p; r=p; } return L; } void Print(List L) { if(L->Next) { List r=L; while(r->Next) { r=r->Next; printf("%d ",r->Data); } puts(""); } else { printf("NULL\n"); } } List Merge(List L1,List L2){ List p1,p2,p3,head; head=(struct Node*)malloc(sizeof(struct Node)); p3=head; p3->Next=NULL; p1=L1->Next,p2=L2->Next; while(p1&&p2){ if(p1->Data<=p2->Data){ p3->Next=p1; p3=p3->Next; p1=p1->Next; }else{ p3->Next=p2; p3=p3->Next; p2=p2->Next; } } p3->Next=p1?p1:p2; L1->Next=NULL; L2->Next=NULL; return head; }
- 堆棧(后入先出)
-
#include<stdio.h> #include<stdlib.h> typedef struct _node{ int value; struct _node *next; } Node; int main(){ int n=5,number; Node *head=(Node*)malloc(sizeof(Node));//創建了一個尾部(空)節點,用於創建堆棧對象; Node *end,*node; head->next=NULL; end=head; end->next=NULL; while(n--){ scanf("%1d",&number); node=(Node*)malloc(sizeof(Node)); node->value=number; // end->next=node; // end=node; node->next=head->next; head->next=node; } end=node; // printf("%d ",end->value); while(end){ printf("%d ",end->value);//這個尾部有一個(空)節點的堆棧與 end=end->next;//頭部有一個(空))節點的 end=end->next的順序不同 鏈表是先 end=end->next } }