天天看點

C連結清單的簡單案例

此案例隻是簡單的使用連結清單

連結清單的特點:

  1.不需要提前知道要存入資料的長度

  2.最後結點為NULL

  3.頭結點指向下一個結點的結構體指針

#include <stdio.h>
#include <process.h>

struct Student{
    char cName[20];    //姓名 
    int iNumber;    //學号 
    struct Student *pNext;    //指向下一個結點的位址 
}; 

int iCount;    //全局變量,用來表示連結清單長度 

//建立連結清單傳回連結清單的頭指針 
struct Student *Create(){
    struct Student *pHead = NULL;    //定義頭指針
    struct Student *pEnd, *pNew;    //最後一個結點和新的結點
    
    iCount = 0;    //初始化連結清單長度
    
    //給最後 一個結點和新結點配置設定記憶體空間 
    pEnd = pNew = (struct Student *)malloc(sizeof(struct Student)); 
    //提示讓其輸入姓名和 學号 
     printf("please enter the name,then the number\n");
     scanf("%s", &pNew->cName);
     scanf("%d", &pNew->iNumber);
     
     //判斷輸入的學号是否為0,不為0就進行處理 
     while(pNew->iNumber    !=0){
         iCount++;    //結點加1
        if(iCount == 1){
            pHead = pNew;    //頭指針指向下個結點的位址 
            pNew->pNext = pHead;
            pEnd = pNew;    //pEnd這是跟蹤的指針結點 
        }else{
            pEnd->pNext = pNew;    //讓之前的元素的指針指向下一個結點的位址 
            pNew->pNext = NULL;    //讓目前的元素的指針域指向NULL 
            pEnd = pNew;
        }
        //再給pNew配置設定記憶體空間 
        pNew = (struct Student *)malloc(sizeof(struct Student)); 
         printf("please enter the name,then the number\n");
         scanf("%s", &pNew->cName);
         scanf("%d", &pNew->iNumber);
     }
     free(pNew);
     return pHead;
}


//輸對外連結表
void Print(struct Student *pHead){
    struct Student *pTemp;    //定義一個臨時指針
    int iIndex = 0;    //用來計算有多少個指針輸出
    
    printf("=====the links has %d element======\n", iCount);
    printf("|iIndex|   name   |iNumber|\n");
    pTemp = pHead;
    while(pTemp != NULL){
        iIndex++;
        printf("%6d", iIndex);
        printf("%10s", pTemp->cName);
        printf("%7d\n", pTemp->iNumber);
        pTemp = pTemp->pNext; 
    }
    printf("===================================\n");
} 

//插入元素,隻需要頭指針就行,并傳回頭指針 
struct Student *Insert(struct Student *pHead){
    struct Student *pNew;
    pNew = (struct Student *)malloc(sizeof(struct Student));    //配置設定記憶體空間
    printf("請輸入name和number :\n");
    scanf("%s", &pNew->cName);
    scanf("%d", &pNew->iNumber);
    pNew->pNext = pHead;
    pHead = pNew; 
    iCount++;    
    return pHead;
} 

//删除元素, 傳一個頭指針,以及第幾個元素,無傳回值
void Delete(struct Student *pHead, int iIndex){
    int i;    //用于循環
    struct Student *pPre;    //定義前一個結構體指針變量 
    struct Student *pTemp;    //定義要删除的結構體指針變量 
    pPre = pTemp = pHead;    //都指向pHead 
    
    //循環的目的是讓pTemp為要删除的結點,pPre為其前面一個結點 
    for(i=1; i<iIndex; i++){
        pPre = pTemp;
        pTemp = pTemp->pNext; 
    }
    
    pPre->pNext = pTemp->pNext;    //删除pTemp結點
    free(pTemp);
    iCount--; 
}

//寫入檔案
void Save(struct Student *pHead){
    FILE *p;    //定義一個檔案指針 
    struct Student *pTemp;    //定義一個結構體指針變量 
    p = fopen("data.txt", "a+");
    if(p == NULL){
        printf("打開檔案失敗!\n");
    }
    pTemp = pHead;
    while(pTemp!=NULL){
        //fputs(pTemp->cName, p);
        fprintf(p, "%15s", pTemp->cName);
        fprintf(p, "%10d", pTemp->iNumber);
        fputs("\n", p);
        pTemp = pTemp->pNext;
    }
    fclose(p);    //關閉指針 
} 

int main(){
    struct Student *pHead;
    pHead = Create();
    pHead = Insert(pHead);
    Delete(pHead, 2);
    Save(pHead);
    Print(pHead);
    return 0;
}      

效果:

繼續閱讀