鏈表/堆棧(【常用方式】頭節點不存放數據的方式)(C語言版)


常用的鏈表/堆棧 都是先 生成一個頭指針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  
        }
    } 

     

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM