c语言实现顺序表
程序员文章站
2022-07-15 09:14:22
...
c语言实现顺序表
数据结构实验
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxsize 10
typedef struct {
char no[20];
char name[20];
int price;
}Student;
typedef struct List{
Student *elem;
int length;
}SqList;
int tableflag=0; //设全局变量,标示表是否存在
SqList initList() //建表
{
SqList L;
int size,i;
printf("请输入学生个数,不能超过%d个:\n",maxsize);
scanf("%d",&size);
if(size>maxsize||size<=0)
{
printf("超出限制大小,请重新建表");
exit(0);
}
L.elem=(Student *)malloc(size*sizeof(Student));
for(i=0;i<size;i++)
{
printf("请输入第%d名学生学号",i+1);
scanf("%s",&L.elem[i].no);
printf("请输入第%d名学生姓名",i+1);
scanf("%s",&L.elem[i].name);
printf("请输入第%d名学生成绩",i+1);
scanf("%d",&L.elem[i].price);
}
L.length=i;
tableflag=1;
return L;
}
void search_name(SqList L,char *Name) //按名字查询
{
int i;
int flag=0;
for(i=0;i<L.length;i++)
{
if(strcmp(L.elem[i].name,Name)==0)
{
printf("该学生学号为%s ",L.elem[i].no);
printf("该学生成绩为%d\n",L.elem[i].price);
flag=1;
}
}
if(flag==0)printf("查无此人\n");
}
void search_num(SqList L,int num) //按序号查询
{
int i;
int flag=0;
for(i=0;i<L.length;i++)
{
if(num==i+1)
{
printf("该学生学号为%s ",L.elem[i].no);
printf("该学生姓名为%s ",L.elem[i].name);
printf("该学生成绩为%d\n",L.elem[i].price);
flag=1;
}
}
if(flag==0) printf("查无此人\n") ;
}
void Traver(SqList L) //遍历
{
int i;
printf("学生信息陈列如下,请检查核对\n");
for(i=0;i<L.length;i++)
{
printf("%d:",i+1);
printf("%s ",L.elem[i].no);
printf("%s ",L.elem[i].name);
printf("%d\n",L.elem[i].price);
}
printf("共有%d个学生\n",L.length);
}
SqList insert(SqList L,int loc) //插入
{
int i=loc-1;
if(L.length>maxsize)
{
printf("超出限制大小,请重新建表");
exit(0);
}
for(int j=L.length;j>=i;j--)
{
L.elem[j+1]=L.elem[j];
}
printf("请输入第插入学生学号");
scanf("%s",&L.elem[i].no);
printf("请输入第插入学生姓名");
scanf("%s",&L.elem[i].name);
printf("请输入第插入学生成绩");
scanf("%d",&L.elem[i].price);
++L.length;
return L;
}
SqList del(SqList L,int loc) //删除
{
int i=loc-1;
printf("删除学生的学号为%s",L.elem[i].no);
printf("删除学生的姓名为%s",L.elem[i].name);
printf("删除学生的成绩为%d\n",L.elem[i].price);
Student *q=&L.elem[loc];
Student *p=&L.elem[L.length-1];
for(;p>=q;q++)
{
*(q)=*(p+1);
}
L.length--;
return L;
}
int main()
{
SqList L;
int i=0;
int e=9;
int loc=-1;
int num;
char Name[20];
while(e!=0)
{ //操作表单
printf("***************************************************************************\n");
printf("请输入要进行的操作,0表示结束退出操作:\n");
printf("1:建立新表\n");
printf("2:按名字查询\n");
printf("3:按位置查询\n");
printf("4:插入\n");
printf("5:删除\n");
printf("6:遍历\n");
printf("7:将数据写入文件 \n");
printf("8:从文件中读取数据\n");
printf("***************************************************************************\n");
scanf("%d",&e);
switch(e)
{
case 0: printf("退出操作:\n");break; //终止
case 1: //建表
{
if ( tableflag==1)
{
printf("你已经建了一个表了,请将数据导入文件后重启程序建新表\n");
break;
}
L=initList();
break;
}
case 2: //按名字查询
{
if ( tableflag==0)
{
printf("你还没有建表\n");
break;
}
printf("请输入学生名字:");
while(getchar()!='\n');
gets(Name);
search_name( L,Name);
break;
}
case 3: //按位置查询
{
if ( tableflag==0)
{
printf("你还没有建表\n");
break;
}
printf("请输入学生位置:");
scanf("%d",&num);
search_num( L, num);
break;
}
case 4: //插入
{
if ( tableflag==0)
{
printf("你还没有建表\n");
break;
}
printf("请输入插入位置:");
scanf("%d",&loc);
if(loc<=0&&loc>L.length) printf("输入位置错误\n");
else
{
L=insert(L, loc);
}
break;
}
case 5: //删除
{
if ( tableflag==0)
{
printf("你还没有建表\n");
break;
}
printf("请输入删除位置:");
scanf("%d",&loc);
if(loc<=0&&loc>L.length) printf("输入位置错误\n");
else
{
L=del(L, loc);
}
break;
}
case 6: //遍历
{
if ( tableflag==0)
{
printf("你还没有建表\n");
break;
}
Traver(L);
break;
}
case 7: //写入文件
{
if (tableflag==0)
{
printf("你还没有建表\n");
break;
}
char acc[20];
FILE *fp;
printf("请输入存储路径\n");
scanf("%s",&acc);
if((fp=fopen(acc,"w"))==NULL)
{
printf("打开文件失败\n");
break;
}
printf("打开文件成功\n");
fprintf(fp,"%d\n",L.length);
for(i=0;i<L.length;i++)
{
fprintf(fp,"%s\n",L.elem[i].no);
fprintf(fp,"%s\n",L.elem[i].name);
fprintf(fp,"%d\n",L.elem[i].price);
}
rewind(fp);
fclose(fp);
break;
}
case 8: //读取文件
{
char ne[1];
char acc[20];
if ( tableflag==1)
{
printf("你已经建了一个表了,请将数据导入文件后重启程序建新表\n");
break;
}
FILE *fp;
printf("请输入打开路径\n");
scanf("%s",&acc);
if((fp=fopen(acc,"r"))==NULL)
{
printf("打开文件失败\n");
break;
}
printf("打开文件成功");
fscanf(fp,"%d",&L.length);
fgets(ne,0,fp); //使文件指针换行,方便读取
L.elem=(Student *)malloc(L.length*sizeof(Student));
for(i=0;i<L.length;i++)
{
fscanf(fp,"%s",&L.elem[i].no);
fgets(ne,0,fp);
fscanf(fp,"%s",&L.elem[i].name);
fgets(ne,0,fp);
fscanf(fp,"%d",&L.elem[i].price);
}
rewind(fp);
fclose(fp);
tableflag=1;
break;
}
default:printf("输入出错,请重新尝试\n");
}
}
}