C链表的简单案例
此案例只是簡單的使用鏈表
鏈表的特點:
1.不需要提前知道要存入數(shù)據(jù)的長度
2.最后結(jié)點為NULL
3.頭結(jié)點指向下一個結(jié)點的結(jié)構(gòu)體指針
#include <stdio.h> #include <process.h>struct Student{char cName[20]; //姓名 int iNumber; //學(xué)號 struct Student *pNext; //指向下一個結(jié)點的地址 }; int iCount; //全局變量,用來表示鏈表長度 //創(chuàng)建鏈表返回鏈表的頭指針 struct Student *Create(){struct Student *pHead = NULL; //定義頭指針struct Student *pEnd, *pNew; //最后一個結(jié)點和新的結(jié)點 iCount = 0; //初始化鏈表長度//給最后 一個結(jié)點和新結(jié)點分配內(nèi)存空間 pEnd = pNew = (struct Student *)malloc(sizeof(struct Student)); //提示讓其輸入姓名和 學(xué)號 printf("please enter the name,then the number\n");scanf("%s", &pNew->cName);scanf("%d", &pNew->iNumber);//判斷輸入的學(xué)號是否為0,不為0就進(jìn)行處理 while(pNew->iNumber !=0){iCount++; //結(jié)點加1if(iCount == 1){pHead = pNew; //頭指針指向下個結(jié)點的地址 pNew->pNext = pHead;pEnd = pNew; //pEnd這是跟蹤的指針結(jié)點 }else{pEnd->pNext = pNew; //讓之前的元素的指針指向下一個結(jié)點的地址 pNew->pNext = NULL; //讓當(dāng)前的元素的指針域指向NULL pEnd = pNew;}//再給pNew分配內(nèi)存空間 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)); //分配內(nèi)存空間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; //用于循環(huán)struct Student *pPre; //定義前一個結(jié)構(gòu)體指針變量 struct Student *pTemp; //定義要刪除的結(jié)構(gòu)體指針變量 pPre = pTemp = pHead; //都指向pHead //循環(huán)的目的是讓pTemp為要刪除的結(jié)點,pPre為其前面一個結(jié)點 for(i=1; i<iIndex; i++){pPre = pTemp;pTemp = pTemp->pNext; }pPre->pNext = pTemp->pNext; //刪除pTemp結(jié)點free(pTemp);iCount--; }//寫入文件 void Save(struct Student *pHead){FILE *p; //定義一個文件指針 struct Student *pTemp; //定義一個結(jié)構(gòu)體指針變量 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); //關(guān)閉指針 } int main(){struct Student *pHead;pHead = Create();pHead = Insert(pHead);Delete(pHead, 2);Save(pHead);Print(pHead);return 0; }
效果:
?
總結(jié)
- 上一篇: Java IO 之 InputStrea
- 下一篇: Ruby on Rails: 使用dev