此案例只是简单的使用链表
链表的特点:
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;
}
效果: