学生的学号、姓名、性别、年龄
1、用线性表的顺序存储(数组)保存数据
(1)键盘输入你所在宿舍的同学信息到数组;
(2)遍历输出所有学生数据;
(3)按姓名查找并输出指定学生数据,统计查找的次数;
(4)把数组内容输出到文件;
(5)从文件读入学生数据,按学号排序后显示在屏幕;
(6)某同学调入你的宿舍,请增加其信息;并查看增加后的结果;
(7) 某同学调离你的宿舍,请删除其信息;并查看删除后的结果;
2、用线性表的链式存储(链表)保存数据,重新实现第1题的功能。
//顺序表
#include
#include
#include
#define maxsize 100
typedef struct
{
int num;
char name[10];
char gender[3];
int age;
}studen;
typedef struct
{
studen elen[maxsize];
int last;
}seqlist;
seqlist s;
int k=1;//统计查找次数
static int len;//静态全局变量,存放输入的宿舍人数
void init()
{
int i;
printf("请输入学生宿舍人数:");
scanf("%d",&len);
s.last=len-1;
for(i=0;i<=s.last;i++)
{
printf("请输入第%d个学生学号:",i+1);
scanf("%d",&s.elen[i].num);
printf("请输入第%d个学生姓名:",i+1);
scanf("%s",s.elen[i].name);
printf("请输入第%d个学生性别:",i+1);
scanf("%s",s.elen[i].gender);
printf("请输入第%d个学生年龄:",i+1);
scanf("%d",&s.elen[i].age);
printf("\n");
}
printf("输入学生信息完成!");
}
void stuprint()//显示函数
{
int i;
printf("学生信息\n");
printf("学号\t姓名\t性别\t年龄\n");
for(i=0;i<=s.last;i++)
{
printf("%d\t%s\t%s\t%d\n",s.elen[i].num,s.elen[i].name,s.elen[i].gender,s.elen[i].age);
}
printf("\n");
}
void locate()//按照姓名查找
{
int i=0;
char xm[10];
printf("请输入要查找的学生姓名:");
scanf("%s",xm);
while((i<=s.last)&&(strcmp(s.elen[i].name,xm))!=0)
{
i++;
k++;
}
printf("查找的次数为:%d",k);
printf("\n");
if(i<=s.last)
{
printf("学号:%d\t姓名:%s\t性别:%s\t年龄:%d\n",s.elen[i].num,s.elen[i].name,s.elen[i].gender,
s.elen[i].age);
}
else
printf("未找到该学生!\n");
}
void insertlist(seqlist *s)//插入
{
int i;
int k;
printf("请输入要插入的位置");
scanf("%d",&i);
if((i<1)||(i>s->last+2))
{
printf("插入的位置不合法!");
}
if(s->last>=maxsize-1)
printf("表已满,无法插入!");
else
{
for(k=s->last;k>=i-1;k--)
s->elen[k+1]=s->elen[k];
printf("请输入要添加的学生信息!\n");
printf("请输入学生的学号:");
scanf("%d", &s->elen[i - 1].num);
printf("请输入学生的姓名:");
scanf("%s", s->elen[i - 1].name);
printf("请输入学生的性别:");
scanf("%s", s->elen[i - 1].gender);
printf("请输入学生的年龄:");
scanf("%d", &s->elen[i - 1].age);
s->last=s->last+1;
}
}
void delelist(seqlist *s)
/*按姓名删除*/
{
int i = 0, k;
char xm[10];//存放输入要删除的数据
printf("请输入要删除的姓名:");
scanf("%s", xm);
while ((i <= s->last) && (strcmp(s->elen[i].name, xm)) != 0)
i++;
if (i <= s->last)
{
printf("删除学生信息为:学号:%d 姓名:%s 性别:%s 年龄:%d ", s->elen[i].num, s->elen[i].name, s->elen[i].gender,s->elen[i].age);
for (k = i; k <= s->last; k++)
s->elen[k-1] = s->elen[k];
s->last--;
}
else
printf("没有该学生!\n");
}
//写文件操作
void savetofile()
{
FILE *fp;
if((fp=fopen("d:\\st1.txt","wb+"))==NULL)
{
printf("不能打开文件");
return;
}
for(int i=0;i<=s.last;i++)
{ fprintf(fp,"%d %s %s %d\r\n",s.elen[i].num,s.elen[i].name,s.elen[i].gender,s.elen[i].age); //写入数据到文件中
}
printf("\n写入成功!\n");
}
//读文件操作
void readfile()
{
FILE * fp; //指针变量
int i;
if((fp=fopen("d:\\st1.txt","rb"))==NULL) //rb方式 打开 是用2进制方法打开,只读文件
{
printf("Cannot open file\n");
return;
}
for(i=0;i<=s.last;i++)
{
fscanf(fp,"%d %s %s %d\r\n",&s.elen[i].num,s.elen[i].name,s.elen[i].gender,&s.elen[i].age); //从文件中读取数据
printf("读取的文件中学号为:%d 姓名:%s 性别:%s 年龄:%d\n",s.elen[i].num,s.elen[i].name,s.elen[i].gender,s.elen[i].age);
//输出读取的数据
}
fclose(fp);//文件关闭
}
void menu() //目录
{
printf("\n\n\n\n");
printf("\t\t\t学生信息管理系统\n");
printf("\t\t\t1\t输入学生信息\n");
printf("\t\t\t2\t输出学生信息\n");
printf("\t\t\t3\t查找学生信息\n");
printf("\t\t\t4\t添加学生信息\n");
printf("\t\t\t5\t删除学生信息\n");
printf("\t\t\t6\t写入文件\n");
printf("\t\t\t7\t读取文件\n");
printf("\t\t\t0\t退出\n");
printf("\t\t\n");
printf("\t\t\t请选择(0—7):");
}
int main()
{
int n;
menu();
while(1)
{
scanf("%d",&n);
switch(n)
{
case 1:init();break;
case 2:stuprint();break;
case 3:locate();break;
case 4:insertlist(&s);break;
case 5:delelist(&s);break;
case 6:savetofile();break;
case 7:readfile();break;
case 0:exit(0);break;
default:printf("\t\t\t请选择(0—7):");break;
}
menu();
}
return 0;
}
//单链表
#include
#include
#include"string.h"
typedef struct
{
int num;
char name[10];
char sex[10];
int age;
}stu;
typedef struct Node
{
stu data;
struct Node *next;
}Node,*linklist;
static int count;
int k=1;//存放比较的次数
void insert(linklist head)
{
linklist q,p;
q=head;
printf("请输入学生人数!\n");
scanf("%d",&count);
for(int i=0;i { printf("\n输入第%d个学生信息:\n",i+1); p=(linklist)malloc(sizeof(Node)); printf("输入学号:"); scanf("%d",&p->data.num); printf("输入姓名:"); scanf("%s",p->data.name); printf("输入性别:"); scanf("%s",p->data.sex); printf("输入年龄:"); scanf("%d",&p->data.age); printf("输入第%d个学生信息完成!",i+1); if(i==0) { head->next=p; //i=0 链表中没有元素,只有头节点,把p插入到head之后作为第一个结点 } else { q->next=p; } q=p; } p->next=NULL;//设置next域为空 } void print(linklist head) { linklist x; x=head->next; printf("学生信息如下:\n"); while(x) { printf("学号:%d\t 姓名:%s\t 性别:%s\t 年龄:%d\n",x->data.num,x->data.name,x->data.sex,x->data.age); x=x->next; } printf("\n"); } void locate(linklist l) { Node *p; int flag = 0;//标志变量 p = l->next; /*从表中第一个结点开始 */ char xm[10];//字符数组用来存放输入的姓名 printf("请输入要查找的姓名:"); scanf("%s", xm); while (p != NULL) { if (strcmp(p->data.name, xm) != 0)//比较是否相同,为零则相同,成功查找到 { p = p->next; k++; //当要查找的姓名为第一个的时候,它初始值为1,已经查找过一次 } else { printf("已找到:学号:%d 姓名:%s 性别:%s 年龄%d", p->data.num, p->data.name, p->data.sex, p->data.age); flag = 1; printf("\n"); printf("查找的次数为:%d",k); break; } } if (flag == 0) printf("未找到此人"); } void insertlist(linklist l) { int k=0; Node *pre,*s;//一个用来存放新节点,一个用来存放查找插入位置的结点 int xh,nl; char xm[10]; char xb[10];//用来存放要插入的姓名和学号 int i; pre=l;//从头结点开始寻找 printf("输入要插入的位置:"); scanf("%d",&i); while(pre!=NULL&&k { pre=pre->next; k=k+1; } if(!pre) /*如当前位置pre为空表已找完还未数到第i个,说明插入位置不合理,当条件不成立时执行*/ { printf("插入位置不合法!"); } else { s=(Node*)malloc(sizeof(Node)); printf("输入学号:"); scanf("%d",&xh); printf("请输入姓名:"); scanf("%s", xm); printf("输入性别:"); scanf("%s",xb); printf("输入年龄:"); scanf("%d",&nl); s->data.num=xh; strcpy(s->data.name,xm); strcpy(s->data.sex,xb); s->data.age=nl; s->next=pre->next; pre->next=s;//连接两个结点 printf("\n插入成功!\n"); } } void dellist(linklist l) { Node *pre,*r; int k=0; char xm[10]; int flag=0; pre=l; printf("输入要删除的学生姓名:"); scanf("%s",xm); while( pre->next!=NULL) { if(strcmp(pre->next->data.name,xm)!=0) { pre=pre->next;//指向下一个结点 } else { flag=1; break; } } if(flag==0) { printf("未找到该学生!"); } r=pre->next;//存放要删除的结点地址 pre->next=pre->next->next;//实现删除功能 printf("删除成功!\n"); } void savetofile(linklist head) { FILE *fp; linklist p; p=head->next;//指向第一个结点 if((fp=fopen("d:\\st2.txt","wb+"))==NULL) // 在d盘打开文件st2 以wb+方式打开 如果文件不存在则会建立,如果文件存在会覆盖 { printf("不能打开文件"); return; } while(p) { //写入数据到文件中 fprintf(fp,"%d %s %s %d\r\n",p->data.num,p->data.name,p->data.sex,p->data.age); p=p->next; } printf("\n写入成功\n"); } void readfile(linklist head)//把文件中的内容做成一个链表 { FILE *fp; linklist p; //定义一个链表结点 p=head->next; //该结点指向第一个元素 if((fp=fopen("d:\\st2.txt","rb"))==NULL)// 在d盘打开文件st2 以rb方式打开 { printf("不能打开文件"); return; } while(p) // 如果p存在 读取文件中的数据 { { fscanf(fp,"%d %s %s %d\r\n",&p->data.num,p->data.name,p->data.sex,p->data.age); //从文件中读取数据到链表里面 printf("读取的文件中学号为:%d 姓名:%s 性别:%s 年龄:%d\n",p->data.num,p->data.name,p->data.sex,p->data.age); p=p->next;//下一个元素 } fclose(fp); //文件关闭 } } void menu() { printf("\n\n\n\n"); printf("\t\t\t学生信息管理系统\n"); printf("\t\t\t1\t输入学生信息\n"); printf("\t\t\t2\t输出学生信息\n"); printf("\t\t\t3\t查找学生信息\n"); printf("\t\t\t4\t添加学生信息\n"); printf("\t\t\t5\t删除学生信息\n"); printf("\t\t\t6\t写入文件\n"); printf("\t\t\t7\t读取文件\n"); printf("\t\t\t0\t退出\n"); printf("\t\t\n"); printf("\t\t\t请选择(0—7):"); } int main() { linklist l; l=(linklist)malloc(sizeof(Node)); l->next=NULL;//初始化头结点 int n; menu(); while (1) { scanf("%d", &n); //输入一个整数 switch (n) { case 0: exit(0); case 1: insert(l); break; case 2: print(l); break; case 3: locate(l); break; case 4: insertlist(l); break; case 5: dellist(l); break; case 6:savetofile(l);break; case 7:readfile(l);break; default: break; } menu(); } return 0; }