定义一个包含学生信息(学号,姓名,成绩)的的 顺序表和链表,使其具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据姓名进行查找,返回此学生的学号和成绩;
(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
(5) 给定一个学生信息,插入到表中指定的位置;
(6) 删除指定位置的学生记录;
(7) 统计表中学生个数。
链表:
#include<cstdio>
#include<cstring>
typedef struct
{
char no[20];
char name[20];
int grade;
} student;
typedef struct lnode //单链表的存储结构
{
student data; //结点的数据域
struct lnode *next; //结点的指针域
} lnode,*linklist;
int init(linklist &L)
{ //构建一个空的单链表
L = new lnode; //生成新节点作为头节点,用指针L指向头节点
L->next=NULL; //头节点的指针域置空
return 1;
}
linklist search(linklist L,student e)
{ //链表的查找
linklist p = L->next;
while(p && strcmp(p->data.name,e.name))
{
p=p->next;
}
return p;
}
int insert(linklist L,int i,student e)
{ //在链表L中第i个位置之前插入新的元素e
linklist p=L;
int j=0;
while(p && (j<i-1))
{
p=p->next;
++j;
}
if(!p || j>i-1)
return 0;
linklist s=new lnode;
s->data=e;
s->next=p->next;
p->next=s;
return 1;
}
int delete_(linklist L,char *i)
{ //链表的删除
linklist p=L;
int j=0;
while((p->next) && (strcmp(p->next->data.no,i)))
{
p=p->next;
}
if(!(p->next))
return 0;
linklist q=p->next;
p->next=q->next;
delete q;
return 1;
}
int main()
{
linklist L,temp,a;
int choose,i,x,ss;
char c[20];
student b,e;
printf("1. 建立链表\n");
printf("2. 输入数据\n");
printf("3. 查找\n");
printf("4. 插入\n");
printf("5. 删除\n");
printf("6. 输出数据\n");
printf("7. 输出学生个数\n");
printf("0. 退出\n\n");
choose = -1;
int sum;
while(choose != 0)
{
printf("请选择:");
scanf("%d",&choose);
switch(choose)
{
case 1:
sum=0;
if(init(L)) //创建顺序表
printf("成功建立链表\n\n");
else
printf("失败\n\n");
break;
case 2:
{
printf("输入学生数量:");
scanf("%d",&x);
sum=x;
linklist r=L;
for(i = 0 ; i < x ; i++)
{
linklist p = new lnode;
printf("第%d位:\n",i+1);
printf("学号:");
scanf("%s",p->data.no);
printf("名字:");
scanf("%s",p->data.name);
printf("分数:");
scanf("%d",&p->data.grade);
p->next=NULL;
r->next=p;
r=p;
printf("***OK***\n\n");
}
break;
}
case 3:
{
printf("输入查找的姓名:"); //顺序表的查找
scanf("%s",e.name);
temp = search(L,e);
if(temp!=NULL)
printf("学号:%-20s 成绩:%-10d\n\n",temp->data.no,temp->data.grade);
else
printf("查找失败\n\n");
break;
}
case 4:
{
printf("输入插入的位置:"); //顺序表的插入
scanf("%d",&ss);
printf("输入插入学生信息:\n");
printf("学号:");
scanf("%s",b.no);
printf("姓名:");
scanf("%s",b.name);
printf("成绩:");
scanf("%d",&b.grade);
if(insert(L,ss,b))
{
sum++;
printf("插入成功。\n\n");
}
else
printf("插入失败。\n\n");
break;
}
case 5:
{
printf("输入要删除学生的学号;"); //顺序表的删除
scanf("%s",c);
if(delete_(L,c))
{
sum--;
printf("删除成功\n\n");
}
else
printf("删除失败\n\n");
break;
}
case 6:
{
printf("当前链表为:\n"); //顺序表的输出
linklist p=L->next;
while(p!=NULL)
{
printf("学号:%-20s姓名:%-20s成绩:%-10d\n",p->data.no,p->data.name,p->data.grade);
p=p->next;
}
printf("\n");
break;
}
case 7:
{
printf("学生个数为:%d\n\n",sum);
}
}
}
return 0;
}
顺序表:
#include<stdio.h>
#include<string.h>
typedef struct
{
char no[20];
char name[20];
int grade;
} student;
typedef struct
{
student *elem; //存储空间的基地址
int length; //当前长度
} sqlist;
int init(sqlist *L)
{ //构造一个空的顺序表L
L->elem = new student[100]; //为顺序表分配一个大小为100的数组空间
if(!L->elem)
return 0; //存储分配失败
L->length = 0;
return 1;
}
int search(sqlist *L,student e)
{ //顺序表的查找
int i;
for(i = 0 ; i < L->length ; i++)
{
if(!strcmp(L->elem[i].name,e.name))
return i+1;
}
return 0;
}
int insert(sqlist *L,int i,student e)
{ //在顺序表L中第i个位置之前插入新的元素e
//i值的合法范围是1<=i<=L.length+1
int j;
if((i < 1) || (i > L->length+1))
return 0; //i值不合法
for(j = L->length-1 ; j >= i-1 ; j--)
{
L->elem[j+1] = L->elem[j]; //插入位置及之后的元素后移
}
L->elem[i-1] = e; //将新元素e放入第i个位置
++L->length; //表长增1
return 1;
}
int delete_(sqlist *L,char *i,char *e)
{ //顺序表的删除
int j = 0;
while(j<L->length && strcmp(L->elem[j].no,i))
{
j++;
}
if(j != L->length)
{
strcpy(e,L->elem[j].name);
for(;j < L->length-1 ; j++)
{
L->elem[j] = L->elem[j++];
}
}
else return 0;
--L->length; //表长减1
return 1;
}
int main()
{
sqlist L;
int i,temp,a,choose,x;
student b,e;
char res[20],c[20];
printf("1. 建立顺序表\n");
printf("2. 输入数据\n");
printf("3. 查找\n");
printf("4. 插入\n");
printf("5. 删除\n");
printf("6. 输出数据\n");
printf("7. 输出学生个数\n");
printf("0. 退出\n\n");
choose = -1;
int sum;
while(choose != 0)
{
printf("请选择:");
scanf("%d",&choose);
switch(choose)
{
case 1:
sum=0;
if(init(&L)) //创建顺序表
printf("成功建立顺序表\n\n");
else
printf("建立顺序表失败\n\n");
break;
case 2:
printf("请输入学生的数量:");
scanf("%d",&x);
sum=x;
for(i = 0 ; i < x ; i++)
{
printf("第%d位:\n",i+1);
printf("学号:");
scanf("%s",L.elem[i].no);
printf("名字:");
scanf("%s",L.elem[i].name);
printf("成绩:");
scanf("%d",&L.elem[i].grade);
printf("***OK***\n\n");
}
L.length = x;
printf("\n");
break;
case 3:
printf("输入查找的姓名:"); //顺序表的查找
scanf("%s",e.name);
temp = search(&L,e);
if(temp != 0)
printf("学号:%-20s 成绩:%-10d\n\n",L.elem[temp-1].no,L.elem[temp-1].grade);
else
printf("查找失败\n\n");
break;
case 4:
printf("输入插入的位置:"); //顺序表的插入
scanf("%d",&a);
printf("输入插入学生信息:\n");
printf("学号:");
scanf("%s",b.no);
printf("姓名:");
scanf("%s",b.name);
printf("成绩:");
scanf("%d",&b.grade);
if(insert(&L,a,b))
{
sum++;
printf("插入成功。\n\n");
}
else
printf("插入失败。\n\n");
break;
case 5:
printf("输入要删除的学生的学号:"); //顺序表的删除
scanf("%s",c);
if(delete_(&L,c,res))
{
sum--;
printf("删除成功\n被删除的学生是:%s\n\n",res);
}
else
printf("删除失败。\n\n");
break;
case 6:
printf("当前顺序表为:\n"); //顺序表的输出
for(i = 0 ; i < L.length ; i++)
{
printf("学号:%-20s,姓名:%-20s,成绩:%-10d\n",L.elem[i].no,L.elem[i].name,L.elem[i].grade);
}
printf("\n\n");
break;
case 7:
{
printf("学生个数为:%d\n\n",sum);
}
}
}
return 0;
}