此案例隻是簡單的使用連結清單
連結清單的特點:
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;
}
效果: