利用线性表的基本操作,实现学生成绩的插入、保存、删除、查找等操作的程序
★结点类型和指针类型
typedef struct Student
{
charsno[20];
int G;
}Student;
typedef struct LinkNode
{
DataTypedata;
structLinkNode *next;
}LinkNode,*LinkList;
★本程序包含7个函数:
① 主函数main()
② 初始化线性表函数InitList()
③ 获取元素函数GetElem()
④ 插入元素函数ListInsert ()
⑤ 清空元素函数ClearListList()
⑥ 删除元素函数ListDelete()
⑦ 查找元素函数LocateElem()
★使用说明:
save to file------(s) 保存到文件
insert into List--(i) 显示“输入学生的学号和成绩信息,用空格隔开”,-->要求输入要插入的位置和元素的值(都是整数)。
delete from List--(d) 要求输入要删除元素的位置,执行成功后返回元素的值。
clear List--------(c) 显示“LOCATE e = ”
print List--------(p) 输出已输入的学生学号和成绩信息
exit system-------(e) 退出程序
插入操作中依次输入123 89,234 9生成一个线性表
选择i:输入123,89,插入线性表。
选择i:输入234,95,插入线性表。
选择p:输出
学号 234,成绩95
学号 123,成绩89
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <windows.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef struct Student
{
char sno[20];//学号
int G;//成绩
}Student;
char fileName[]="c:\\stu.txt";
//数据结点定义
typedef Student DataType;
typedef struct LinkNode
{
DataType data;//学生
struct LinkNode *next;
}LinkNode,*LinkList;
//初始化线性表操作
//L:为所要初始化的线性表
void InitList(LinkList &L)
{
L=(LinkList)malloc(sizeof(LinkNode));
L->data.G=0;
L->next=NULL;
}
//获取元素操作,如果获取不成功,返回Error,否则返回OK
//L:为所要操作的线性表
//i:为所要获取的元素的位置
//e:为返回所要获取的元素值
Status GetElem(LinkList L,int i,DataType &e)
{
if(i<1||i>L->data.G) return ERROR;
LinkNode *p=L->next;
for(int k=1;k<i;k++)
p=p->next;
e=p->data;
return OK;
}
//把学生信息存储到文件的操作
void savetoFile(LinkList L)
{
Student e;
FILE *f=fopen(fileName,"w");
for(int k=0;k<L->data.G;k++)
{
GetElem(L,k+1,e);
fprintf(f,"%s %d\n",e.sno,e.G);
}
fclose(f);
}
//从控制台中输入一个学生信息
bool readStudent(Student &e)
{
printf("输入学生的学号和成绩信息,用空格隔开\n");
scanf("%s %d",e.sno,&e.G);
getchar();
return TRUE;
}
//线性表插入操作
//L:为所要操作的线性表
//i:为要把元素插入到的位置
//e:是所要插入的数据元素
Status ListInsert(LinkList &L,int i,DataType e)
{
LinkNode *p;
LinkNode *q=L;
int k=0;
if(i>L->data.G+1||i<0) return FALSE;
while(q && k<i-1){ q=q->next;k++;}
if(!q ||k>i-1) return ERROR;
p=(LinkList)malloc(sizeof(LinkNode));
p->data=e;
p->next=q->next;
q->next=p;
L->data.G++;
return OK;
}
//线性表插入操作 -2- 在线性表头位置插入
Status InsFirst(LinkList &L,DataType e)
{
return ListInsert(L,1,e);//插入位置为1
}
//线性表插入操作 -3- 在线性表末尾位置插入
Status InsLast(LinkList &L,DataType e)
{
return ListInsert(L,L->data.G+1,e);//插入位置为L->data.G+1
}
//线性表清空操作
//L:为所要清空的线性表
Status ClearList(LinkList &L)
{
LinkNode *p= L->next;
while(p)
{
L->next=p->next;
delete p;
p=L->next;
}
return OK;
}
//线性表删除操作,返回值为OK表示删除成功,否则不成功返回ERROR
//L:为所要操作的线性表
//i:为所要删除的元素位置
//e:为返回所要删除的元素
Status ListDelete(LinkList &L,int i,DataType &e)
{
LinkNode *p=L,*q;
if(i<1 ||i>L->data.G) return ERROR;
for(int k=0;k<i-1;k++) p=p->next;
q=p->next;
p->next=q->next;
delete q;
return OK;
}
//定义学生结构体的遍历操作,简单的打印
void visit(Student e)
{
printf("学号:%s,成绩:%d\n",e.sno,e.G);
}
//遍历线性表
//L:为所要遍历的线性表
//visit:为遍历操作
void ListTraverse(LinkList L,void(* visit)(DataType e))
{
LinkNode *p=L->next;
while(p)
{
visit(p->data);
p=p->next;
}
}
//定义学生信息结构体的比较函数
bool compare(Student e1,Student e2)
{
if(e1.G == e2.G && strcmp(e1.sno,e2.sno)) return 1;
else return 0;
}
//查询线性表中元素存在与否,返回等于e的节点位置,不存在情况返回0
//L:为要查询的线性表
//e:为要查询的元素
//compare:为查询操作所用的比较函数
int LocateElem(LinkList L,DataType e, bool (*compare)(DataType,DataType))
{
LinkNode *p=L->next;
int k=1;
while(p)
if((*compare)(p->data,e)) return k;
else k++;
return FALSE;
}
int main()
{
LinkList L;
int pos;
char command='\n';
bool out=FALSE;
char tmp[256];
Student e;
InitList(L);
while(!out)
{
printf("||==========================||\n");
printf("|| ||\n");
printf("|| save to file------(s) ||\n");
printf("|| insert into List--(i) ||\n");
printf("|| delete from List--(d) ||\n");
printf("|| clear List--------(c) ||\n");
printf("|| print List--------(p) ||\n");
printf("|| exit system-------(e) ||\n");
printf("|| ||\n");
printf("||==========================||\n");
gets(tmp);
command=tmp[0];
switch(command)
{
case 's':
savetoFile(L);
break;
case 'i':
readStudent(e);
printf("插入在第几个元素:");
scanf("%d",&pos);
ListInsert(L,pos,e);
break;
case 'c':
ClearList(L);
break;
case 'd':
ListDelete(L,2,e);
break;
case 'p':
ListTraverse(L,visit);
break;
case 'e':out=TRUE;
break;
default:
printf("error command \n");
}
system("pause");fflush(stdin);system("cls");
}
return 0;
}