此案例只是簡單的使用鏈表
鏈表的特點:
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; }
效果: