《数据结构》进行曲 之 单链表实现学生信息管理系统

前端之家收集整理的这篇文章主要介绍了《数据结构》进行曲 之 单链表实现学生信息管理系统前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
#include<stdio.h>
#include<iostream>
using namespace std;

#define MAX 100

typedef struct STU{
	char name[20];
	char sno[20];
	int age;
	float score;
}Student;

typedef struct LNode{
	Student data;
	struct LNode *next;
}LNode,*LinkList;

//初始化(带头结点的单链表)
int InitList(LinkList &L){
	L=new LNode;
	L->next=NULL;
	return 1;
} 

//判断链表是否为空
int ListEmpty(LinkList L){
	if(L->next=NULL){
		return 1;//链表为空 
	}else{
		return 0;//链表非空 
	}
} 

//获取链表长度
int ListLength(LinkList L){
	int length=0;
	struct LNode *p;
	p=L->next;
	while(p){
		p=p->next;
		length++;
	}
	return length;
}

//遍历链表
void TraveList(LinkList L){
	struct LNode *p;
	p=L->next;
	printf("链表结构如下:\n");
	while(p){
		printf("%s %s %d %.2f",p->data.name,p->data.sno,p->data.age,p->data.score);
		printf("\n");
		p=p->next;
	}
} 

//插入操作 
int ListInsert(LinkList &L,int location,Student &e){
	//在链表L的location位置插入元素e
	struct LNode *p;
	int j=0;
	p=L;
	while(p&&j<location-1){
		p=p->next;
		++j;
	} 
	if(!p||j>location-1){
		return 0;
	}
	struct LNode *s;
	s=new LNode;
	s->data=e;
	s->next=p->next;
	p->next=s;
	return 1;
}

//删除操作
int ListDelete(LinkList &L,Student &e){
	//删除L中location位置的元素,并用e返回其值
	struct LNode *p;
	int j=0;
	p=L;
	while(p->next&&j<location-1){
		p=p->next;
		++j;
	} 
	if(!(p->next)||j>location-1){
		return 0;
	}
	struct LNode *q;
	q=new LNode;
	q=p->next;
	p->next=q->next;
	e=q->data;
	delete q;
	return 1;
} 

//头插法法创建单链表
void CreateList1(LinkList &L,int n){
	//创建长度为n的单链表
	L=new LNode;
	L->next=NULL;
	printf("请输入链表元素;\n");
	for(int i=n;i>0;--i){
		printf("请输入第%d个元素值:\n",i);
		struct LNode *p;
		p=new LNode;//生成新结点
		//输入
		printf("请输入姓名:");
		scanf("%s",p->data.name); 
		printf("请输入学号:");
		scanf("%s",p->data.sno);
		printf("请输入年龄:");
		scanf("%d",&p->data.age);
		printf("请输入成绩:");
		scanf("%f",&p->data.score);
		p->next=L->next;
		L->next=p;
	} 
} 

//尾插法创建单链表
void CreateList2(LinkList &L,int n){
	L=new LNode;
	L->next=NULL;
	struct LNode *r;
	r=L;
	printf("请输入链表元素值:\n");
	for(int i=0;i<n;i++){
		struct LNode *p;
		p=new LNode;
		printf("请输入第%d个元素的值:\n",i+1);
		printf("请输入姓名:");
		scanf("%s",p->data.name);
		printf("请输入学号:");
		scanf("%s",&p->data.score);
		p->next=NULL;
		r->next=p;
		r=p;
	}
} 
int main(){
	
	LinkList L;

	printf("1.初始化链表\n");
	printf("2.创建链表\n");
	printf("3.插入操作\n");
	printf("4.删除操作\n");
	printf("0.退出\n");
	
	int choose=-1;
	while(choose!=0){
		printf("请选择操作:\n");
		scanf("%d",&choose);
		switch(choose){
			case 1:{
				if(InitList(L)){
					printf("链表初始化成功!\n");
				}else{
					printf("链表初始化失败!\n");
				}
				break;
			}
			case 2:{
				printf("1.头插法创建单链表\n");
				printf("2.尾插法创建单链表\n");
				printf("请选择操作:\n");
				int choose1;
				scanf("%d",&choose1);
				switch(choose1){
					case 1:{
						printf("请输入链表长度:\n");
						int n;
						scanf("%d",&n);
						CreateList1(L,n);
						TraveList(L);
						break;
					}
					case 2:{
						printf("请输入链表长度:\n");
						int n;
						scanf("%d",&n);
						CreateList2(L,n);
						TraveList(L);
						break;
					}
				}
				break;
			}
			case 3:{
				printf("请输入插入的位置和值:\n");
				int location;
				scanf("%d",&location);
				
				Student stu;
				printf("请输入姓名:");
				//char name[20];
				scanf("%s",stu.name);
				
				printf("请输入学号:");
				scanf("%s",stu.sno);
				
				printf("请输入年龄:");
				scanf("%d",&stu.age);
				
				printf("请输入成绩:");
				scanf("%f",&stu.score);
				
				if(ListInsert(L,location,stu)){
					printf("插入成功!\n");
					TraveList(L);
				}else{
					printf("插入失败!\n");
				}
				//TraveList(L);
				break;
			}
			case 4:{
				printf("请输入要删除的元素的位置:\n");
				int location;
				scanf("%d",&location);
				
				Student stu;
				
				if(ListDelete(L,stu)){
					printf("删除成功!\n");
					printf("删除的元素值是:\n");
					printf("%s %s %d %.2f\n",stu.name,stu.sno,stu.age,stu.score);
					TraveList(L);
				}else{
					printf("删除失败!\n");
				}
				//TraveList(L);
				break;
			}
		}
	}
}
 
 





猜你在找的数据结构相关文章