数据结构线性表实现学生信息管理系统

数据结构线性表实现学生信息管理系统

方法一:顺序表实现

#include 
#include 
#include 
#include 
#define MAXSIZE 1000
#define OVERFLOW -1
using namespace std;



typedef struct{
	char num[8];//8位学号 
	char name[20];//学生姓名 
	int score;//学生成绩 
}Student;


typedef struct{
	Student *elem;//指向数据元素的基地址
	int length;//线性表的长度
}SqList;

SqList L;

//初始化顺序表
int InitList(SqList &L){
	L.elem=new Student[MAXSIZE];//为顺序表分配一个大小为MAXSIZE的数组空间    
	if (!L.elem) exit(OVERFLOW);//存储分配失败推出
	L.length=0;//空表长度为0
	return 1;//成功返回1
}

//顺序表的取值
int GetElem(SqList L,int i,Student &s){
	if(i<1||i>L.length){
		return 0;//若i值不合理,返回0
	}else{
		s=L.elem[i-1];//取出第i个元素  存放在i里面  加&是让形参影响到实参 
		return 1;
	}
}

//按学生姓名进行学生信息的查找
int LocateElem(SqList L,Student &s){
	//在顺序表L中查找值e的数据元素,返回其序号
	for(int i=0;i<L.length;i++){
		if(!strcmp(L.elem[i].name,s.name))
		{
				s = L.elem[i];
		return 1;//查找成功
		}
	}
	return 0;//查找失败
}

//插入学生信息 
int ListInsert(SqList &L,int i,Student &s){
	if((i<1)||(i>L.length+1))
		return 0;
	if(L.length==MAXSIZE)
		return 0;//顺序表已达到最大长度 
	for(int j=L.length-1;j>=i-1;j--){
		L.elem[j+1]=L.elem[j];//插入位置及之后的元素全部后移
	}
	L.elem[i-1]=s;//将新元素s插入第i个位置
	++L.length;//顺序表长度加1
	return 1;//插入成功,返回1 
}


//顺序表的删除
int ListDelete(SqList &L,int i){
	//在顺序表L中删除第i个元素,i值的合法范围是1<=i<=L.length
	if((i<1)||(i>L.length))
		return 0;
	for(int j=i;j<=L.length-1;j++){//被删除的元素是第i个元素,但是其下标i-1。j=i,此时j指向的是i后面的一个元素 
		L.elem[j-1]=L.elem[j];//被删除元素之后的元素前移(删除数据的真实操作其实是覆盖)
	}
	--L.length;//顺序表表长度减1
	return 1;//删除成功返回1
}


//输入学生表
void InputList(SqList &L,int i,Student e)
 {
	 L.length+=1;
	 L.elem[i]=e;
	 
 }



//主函数
int main(){
	Student student;
	InitList(L);
	int a;
	while(1) {
		printf("------------学生信息系统------------\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("请输入您的选择:");
		scanf("%d",&a);
		printf("--------------------------------------------------------");
		printf("\n");		
		switch(a)//输入学生的信息;
		{
			case 1:
		{
			for(int i=0;i<5;i++)
			{
				printf("学号:");
				scanf("%s",&student.num);
				printf("姓名:");
				scanf("%s",&student.name);
				printf("成绩:");
				scanf("%d",&student.score);
				InputList(L,i,student);
				printf("\n");
			}
			    printf("输入学生信息成功,请选择接下来的操作…………");
			printf("\n\n\n\n\n\n");
			break;
		}
			
	        case 2://显示全部学生的信息;
		{
		   printf("NO\t\tName\t\t\tScore\t\n");
	       for(int i=1;i<=L.length;i++)
			 {
				GetElem(L,i,student);
				printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score);
			 }
			 printf("\n\n\n\n\n\n");
			break;
		}
		    case 3://根据学生姓名查找学生信息
		{
			int i;
			printf("请输入您要查找学生的名字:");
			scanf("%s",&student.name);
			i=LocateElem(L,student);
			if(!i)
			{
				printf("系统中无记录\n");
			}
			printf("学号:%s\t\t姓名:%s\t\t成绩:%3d\n",student.num,student.name,student.score);
			printf("\n\n\n\n\n\n");
			break;
		}
		 case 4://根据位置查找学生信息
		{
			int local;
			printf("请输入要查询的位置:");
			scanf("%d",&local);
			GetElem(L,local,student);
			printf("学号:%s\t\t姓名:%s\t\t成绩:%d\n",student.num,student.name,student.score);
			printf("\n\n\n\n\n\n");
			break;
		}
		 case 5://给定一个学生信息,插入到表中指定位置;
		{
			int t,i;
			printf("请输入学生的学号:");
			scanf("%s",&student.num);
			printf("请输入学生的姓名:");
			scanf("%s",&student.name);
			printf("请输入学生的成绩:");
			scanf("%d",&student.score);
			printf("请输入插入的位置:");
			scanf("%d",&t);
			i = ListInsert(L,t,student);
	    	if(i)
		{
		   printf("添加成功…………");
		   printf("\n") ;
		   printf("NO\t\tName\t\t\tScore\t\n");
	       for(int i=1;i<=L.length;i++)
			 {
				GetElem(L,i,student);
				printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score);
			 }
		}
		   else
		       printf("插入失败,请选择正确的插入位置…………");
			printf("\n\n\n\n\n\n");
			break;
			
		}
		case 6://删除指定位置的学生信息;
		{
			int i;
			printf("请输入要删除的位置:");
			scanf("%d",&i);
			ListDelete(L,i);
		    printf("删除成功…………");
		    printf("\n");
		    printf("NO\t\tName\t\t\tScore\t\n");
	        for(int i=1;i<=L.length;i++)
			 {
				GetElem(L,i,student);
				printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score);
			 }
			printf("\n\n\n\n\n\n");
			break;
		}	  
	    case 7://统计系统中学生个数
		{
			printf("系统中学生个数:%d\n",L.length);
			printf("\n\n\n\n\n\n");
			break;
		}
		case 8://退出系统;
		 {
			return 0;
		 }
		 default:
		 {
			printf("输入错误,请重新输入");
			printf("\n\n\n\n\n\n");
		 }
     }
  }
}



方法二:链表实现

#include
#include 
#include 
#include 
#define MAXSIZE 1000
using namespace std;


//定义学生 
typedef struct{
	char num[8];//8位学号 
	char name[20];//学生姓名 
	int score;//学生成绩 
}Student;
Student student;


//---单链表的存储结构--- 
typedef struct LNode
{
   Student data;
   struct LNode *next;//节点的指针域	
}LNode,*LinkList;//LinkList为指向结构体LNode的结构体类型 


typedef struct{
	int length;
}T;
T list;


LinkList L;
LNode *p,*s,*q,*head;

//初始化单链表
int InitList(LinkList &L)
{
	//构造一个空的单链表	
	L = new LNode;
	L->next=NULL;
	list.length=0;
	return 1; 
 } 
 
 
 //单链表按照序号取值
int GetElem(LinkList L,int i,Student &e)
{
	//在带头节点的链表L中根据序号i获取元素的值,用e返回L中第i个数据元素的值
	p=L->next;
	int j=1;
	while(p&&j<i)
	{
		p=p->next;
		++j;
	}
	if(!p||j>i)
	    return 0;
	e=p->data;
	return 1;
}





//单链表的姓名查找
int LocateElem(LinkList L,Student &e)
 {
    int j=0;
    p=L->next;
	while(p && strcmp((p->data).name,e.name))//如果p不为空,且p指向的数据与发送过来的数据名字不相等。执行while循环语句 
	{
		p=p->next;
		++j;
	}
	if(!p||j>list.length) 
	    return 0;
	e=p->data;
	return 1;
}


//单链表的插入
int ListInsert(LinkList $L,int i,Student &e)
{
	//在带头结点的链表L中第i个位置插入值为e的新节点 
	p=L;int j=0;
	while(p && (j<i-1)) 
	{
		p=p->next;++j;
	}
	if(!p||j>i-1) return 0;
	s = new LNode;
	s->data=e;
	s->next=p->next;
	p->next=s;
	list.length++;
	return 1;
}


//单链表的删除

int ListDelete(LinkList &L,int i) 
{
	//在带头节点的链表L中删除第i个元素
	p=L;int j=0;
	while((p->next) && (j<i-1)) 
	{p=p->next;++j;}
	if(!(p->next)||(j>i-1)) return 0;//当i>n或i<1时,删除位置不合理
	q=p->next;//临时保存被删除的节点的地址以备释放 
	p->next=q->next;//改变删除节点前驱节点的指针域
	delete q;
    list.length--;
	return 1; 
}


//单链表的创建(后插法)
void CreateList_H(LinkList &L,int n)
{//逆位序输入n个元素的值,建立带表头结点的单链表L
	//L=new LNode;//先建立一个带头结点的空链表
	L->next=NULL;
	Student stu;
	LNode *r;
	r=L;
	for(int i=0;i<n;++i)
	{
		p=new LNode;
		printf("学号:");
		scanf("%s",&student.num);
		printf("姓名:");
		scanf("%s",&student.name);
		printf("成绩:");
		scanf("%d",&student.score);
		list.length++;//输入元素值赋给新结点*p的数据域
		printf("\n\n");
		p->data=student;
		p->next=NULL;
		r->next=p;
		r=p;//将新结点*p插入到头结点之后
	}
}



//主函数
int main()
{
	Student student;
	InitList(L);
	int a;
	while(1) {
		printf("------------学生信息系统------------\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("请输入您的选择:");
		scanf("%d",&a);
		printf("--------------------------------------------------------");
		printf("\n");		
		switch(a)//输入学生的信息;
		{
			case 1:
		{
			CreateList_H(L,5);
			printf("输入学生信息成功,请选择接下来的操作…………");
			printf("\n\n\n\n\n\n");
			break;
		}
			
	        case 2://显示全部学生的信息;
		{
		   printf("NO\t\tName\t\t\tScore\t\n");
	       for(int i=1;i<=list.length;i++)
			 {
				GetElem(L,i,student);
				printf("%s\t\t%s\t\t\t%d\t\n",student.num,student.name,student.score);
			 }
			 printf("\n\n\n\n\n\n");
			break;
		}
		    case 3://根据学生姓名查找学生信息
		{
			int i;
			printf("请输入您要查找学生的名字:");
			scanf("%s",&student.name);
			i=LocateElem(L,student);
			if(!i)
			    printf("系统中没有此学生\n");
			printf("学号:%s\t\t姓名:%s\t\t成绩:%d\n",student.num,student.name,student.score);
			printf("\n\n\n\n\n\n");
			break;
		}
		 case 4://根据位置查找学生信息
		{
			int i;
			int local;
			printf("请输入要查询的位置:");
			scanf("%d",&local);
			GetElem(L,local,student);
			printf("学号:%s\t\t姓名:%s\t\t成绩:%d\n",student.num,student.name,student.score);
			printf("\n\n\n\n\n\n");
			break;
		}
		 case 5://给定一个学生信息,插入到表中指定位置;
		{
			int t,i;
			printf("学号:");
			scanf("%s",&student.num);
			printf("姓名:");
			scanf("%s",&student.name);
			printf("成绩:");
			scanf("%d",&student.score);
			printf("插入位置:");
			scanf("%d",&t);
			ListInsert(L,t,student);
	    	if(1)
		{
		   printf("添加成功…………");
		   printf("\n") ;
		   printf("NO\t\tName\t\t\tScore\t\n");
	       for(int i=1;i<=list.length;i++)
			 {
				GetElem(L,i,student);
				printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score);
			 }
		}
		   else
		       printf("插入失败,请选择正确的插入位置…………");
			printf("\n\n\n\n\n\n");
			break;
			
		}
		case 6://删除指定位置的学生信息;
		{
			int i;
			printf("请输入要删除的位置:");
			scanf("%d",&i);
			ListDelete(L,i);
		    printf("删除成功…………");
		    printf("\n");
		    printf("NO\t\tName\t\t\tScore\t\n");
	        for(int i=1;i<=list.length;i++)
			 {
				GetElem(L,i,student);
				printf("%s\t\t%s\t\t\t%3d\t\n",student.num,student.name,student.score);
			 }
			printf("\n\n\n\n\n\n");
			break;
		}	  
	    case 7://统计系统中学生个数
		{
			printf("系统中学生个数:%d\n",list.length);
			printf("\n\n\n\n\n\n");
			break;
		}
		case 8://退出系统;
		 {
			return 0;
		 }
		default:
		 {
			printf("输入错误,请重新输入");
			printf("\n\n\n\n\n\n");
		 }
     }
  }
}
 
 
 
 
 
 
 
 
 
 
 

你可能感兴趣的:(数据结构)