#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
using namespace std;
#define MAXSIZE 100
typedef struct
{
char num[10]; //8 位学号
char name[20]; // 姓名
int score; // 成绩
}Student;
typedef struct
{
Student *elem; // 指向数据元素的基地址
int length; // 线性表的当前长度
}SqList;
void menu()
{
printf("***************学生信息管理系统***************\n\n");
printf("\t\t 1.输入信息\n");
printf("\t\t 2.显示信息\n");
printf("\t\t 3.按姓名查找\n");
printf("\t\t 4.查找指定位置信息\n");
printf("\t\t 5.插入指定位置信息\n");
printf("\t\t 6.删除指定位置信息\n");
printf("\t\t 7.统计学生信息总数\n");
printf("\t\t 0.退出\n");
printf("***********************************************\n\n");
}
void input(Student &e)
{
printf("请输入学号:");
scanf("%s",e.num);
printf("请输入姓名:");
scanf("%s",e.name);
printf("请输入成绩:");
scanf("%d",&e.score);
}
void output(Student e)
{
printf("学号:%s\t姓名:%s\t成绩:%d\n",e.num,e.name,e.score);
}
int ListInsert(SqList &L,int i,Student e)
{
if(i<1||i>L.length+1) //插入i的位置不符合
return ERROR;
if(L.length==MAXSIZE) //顺序表满了
return ERROR;
for(int j=L.length-1;j>=i-1;j--)
L.elem[j+1]=L.elem[j];
L.elem[i-1]=e; //插入新数据
L.length++; //表长加1
return OK;
}
int ListDelete(SqList &L,int i)
{
if(i<1||i>L.length) //删除位置不符合
return ERROR;
for(int j=i;j<L.length;j++)
L.elem[j-1]=L.elem[j];
L.length--; //表长减1
return OK;
}
int main()
{
int n,m,pos,flag;
char str[20];
Student e;
SqList L;
L.elem=(Student *)malloc(sizeof(Student)*MAXSIZE);
L.length=0;
menu();
while(1)
{
printf("请输入要进行的操作:");
scanf("%d",&m);
if(m==0) break;
if(m<0||m>7)
{
printf("无此操作,请重新输入!\n");
continue;
}
switch(m)
{
case 1:
printf("初始学生人数(1~100):");
scanf("%d",&n);
L.length=n;
printf("请输入学生信息:\n");
for(int i=0;i<n;i++)
{
input(L.elem[i]);
}
printf("输入完成!\n\n");
break;
case 2:
printf("当前所有信息为:\n");
if(L.length==0)
printf("对不起!暂无信息!\n");
else
{
for(int i=0;i<L.length;i++)
output(L.elem[i]);
printf("显示完毕!\n\n");
}
break;
case 3:
printf("请输入要查找的姓名: \n");
scanf("%s",str);
flag=0;
for(int i=0;i<L.length;i++)
{
if(strcmp(L.elem[i].name,str)==0)
{
flag=1;
printf("查找成功,此人信息为:\n");
output(L.elem[i]);
break;
}
}
if(!flag)
printf("查找失败!\n");
printf("\n\n");
break;
case 4:
printf("请输入要查找的信息的位置: ");
scanf("%d",&pos);
if(pos<1||pos>L.length)
printf("输入错误!\n");
else
{
printf("第%d个学生的信息为:\n",pos);
pos-=1;
output(L.elem[pos]);
}
printf("\n\n");
break;
case 5:
printf("请输入要插入的位置:");
scanf("%d",&pos);
printf("请输入学号:");
scanf("%s",e.num);
printf("请输入姓名:");
scanf("%s",e.name);
printf("请输入成绩:");
scanf("%d",&e.score);
if(ListInsert(L,pos,e))
printf("插入成功!");
else
printf("插入失败!\n");
printf("\n\n");
break;
case 6:
printf("请输入要删除的学生信息的位置: ");
scanf("%d",&pos);
if(ListDelete(L,pos))
printf("删除成功!");
else
printf("删除失败!\n");
printf("\n\n");
break;
case 7:
printf("学生总数: %d\n",L.length);
break;
}
}
return 0;
}
/********实验一(链表)***********/
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include<stdlib.h>
#define LEN sizeof(LNode)
using namespace std;
typedef struct
{
char num[10]; //8 位学号
char name[20]; // 姓名
int score; // 成绩
}Student;
typedef struct LNode
{
Student data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
/*void InitList(LinkList &L)//链表初始化
{
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
}*/
void creat(LinkList &L,int n)//后插法,创建链表并输入学生信息
{
L=(LNode *)malloc(sizeof(LNode));//头指针
L->next=NULL;//头节点为空
LNode *p,*r;
r=L;
Student e;
for(int i=0;i<n;i++)
{
printf("请输入学号:");
scanf("%s",e.num);
printf ("请输入姓名:");
scanf("%s",e.name);
printf("请输入成绩:");
scanf("%d",&e.score);
p=(LNode *)malloc(sizeof(LNode));//生成新节点
p->data=e; //将元素值赋给新节点*p的数据域
p->next=NULL;
r->next=p; //插入
r=p; //移动r指向尾结点*p
}
}
void output(LinkList &L)//输出所有学生信息
{
Student e;
LNode *p;
p=L->next;//p初始指向头节点
if(p==NULL){
printf("链表为空!无学生信息!\n");
return ;
}
do{ //逐个输出学生信息
e=p->data;
printf("学号:%s\t姓名:%s\t成绩:%d\n",e.num,e.name,e.score);
p=p->next;
}while(p!=NULL);
printf ("显示完毕!\n");
}
void namesearch(LinkList L,char str[])//按姓名查找学生信息
{
LNode *p;
Student e;
p=L->next;
if(!p)
{
printf("链表为空!查找失败!\n");
return ;
}
while(p && (strcmp(p->data.name,str)))
p=p->next;
if(!p)
{
printf("系统中无该学生信息!\n");
return ;
}
printf("查找成功!该学生信息为:\n");
e=p->data;
printf("学号:%s\t姓名:%s\t成绩:%d\n",e.num,e.name,e.score);
}
int getelem(LinkList L,int i,Student &e)//查找指定位置学生信息
{
LNode *p;
int j=1;
p=L->next;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i) return 0; //i值不合法i>n或i<=0
e=p->data;
return 1;
}
int InsertList(LinkList &L,int i,Student e)//在i出插入新的学生信息
{
LNode *p,*s;
int j=0;
p=L;
while(p&&j<i-1) //查找第i-1个节点,p指向该节点
{
p=p->next;
j++;
}
if(!p||j>i-1) return 0; //i值不合法i>n+1或i<1
s=(LNode *)malloc(sizeof(LNode));//生成新节点*s
s->data=e; //*s的数据域置为e
s->next=p->next; //*s的指针域指向节点ai
p->next=s; //将节点*p的指针域指向节点*s
return 1;
}
int deleteList(LinkList &L,int i)//删除i处学生信息
{
int j=0;
LNode *p,*q;
p=L;
while(p->next && j<i-1) //查找第i-1个节点,p指向该节点
{
p=p->next;
j++;
}
if(!p->next||j>i-1) return 0;//i>n 或 i<1 时,删除位置不合理
q=p->next; //p临时保存被删除节点
p->next=q->next; //改变删除节点前驱节点的指针域
free(q); //释放删除节点的空间
return 1;
}
int length(LinkList L)//链表总长度(学生总人数)
{
int len=0;
LNode *p;
p=L;
while(p->next)
{
len++;
p=p->next; //改变*p的指针域
}
return len;
}
void menu()
{
printf("***************学生信息管理系统***************\n\n");
printf("\t\t 1.创建链表 输入信息\n");
printf("\t\t 2.显示信息\n");
printf("\t\t 3.按姓名查找\n");
printf("\t\t 4.查找指定位置信息\n");
printf("\t\t 5.插入指定位置信息\n");
printf("\t\t 6.删除指定位置信息\n");
printf("\t\t 7.统计学生信息总数\n");
printf("\t\t 0.退出\n");
printf("***********************************************\n\n\n");
}
int main()
{
Student e;LinkList L;
menu();
// InitList(L);
int m,n,l,pos;
char str[10];
while(1)
{
printf("请输入要进行的操作:\n");
scanf("%d",&m);
if(m==0) break;
else if(m<0||m>7) printf("无该项操作!请重新选择!\n\n");
else
{
printf("\n");
switch(m)
{
case 1:
printf("请输入初始人数(1~100):");
scanf("%d",&n);
printf("请输入学生信息:\n");
creat(L,n);
printf("创建完毕!\n\n");
break;
case 2:
printf("当前所有信息为:\n");
output(L);
printf("\n");
break;
case 3:
printf("请输入要查找的姓名: \n");
scanf("%s",str);
namesearch(L,str);
printf("\n");
break;
case 4:
printf("请输入要查找的信息的位置: ");
scanf("%d",&pos);
if(getelem(L,pos,e))
{
printf("查找成功!该生信息为:\n");
printf("学号:%s\t姓名:%s\t成绩:%d\n",e.num,e.name,e.score);
}
else
printf("查找失败!\n");
printf("\n");
break;
case 5:
printf("请输入要插入的位置:");
scanf("%d",&pos);
printf("请输入学号:");
scanf("%s",e.num);
printf("请输入姓名:");
scanf("%s",e.name);
printf("请输入成绩:");
scanf("%d",&e.score);
if(InsertList(L,pos,e))
printf("插入完成!\n\n");
else
printf("插入失败!\n\n");
break;
case 6:
printf("请输入要删除的学生信息的位置: ");
scanf("%d",&pos);
if(deleteList(L,pos))
printf("删除成功!\n");
else
printf("删除失败!\n");
break;
case 7:
l=length(L);
printf("学生总数: %d\n",l);
break;
}
}
}
return 0;
}