0
点赞
收藏
分享

微信扫一扫

数据结构之学生信息管理(C语言)

菜菜捞捞 2022-04-04 阅读 39

数据结构之学生信息管理(C语言)

1.顺序表

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100

typedef struct {
	char no[20];
	char name[30];
	float score;
} Student;

typedef struct {
	Student *elem;
	int length;
	int caption;
} Sqlist;

//初始化一个线性表
int Init(Sqlist &L) {
	L.elem = (Student*)malloc(sizeof(Student));
	if (!L.elem) exit(OVERFLOW);
	L.length = 0;
	L.caption = MAXSIZE;
	return OK;
}

//检查顺序表是否为空
void Check(Sqlist L) {
	if(L.length == 0) {
		printf("当前顺序表为空!");
	} else {
		printf("当前顺序表不为空");
	}
}

//查询(位置)
int Get(Sqlist L, int i, Student &m) {
	if (i<0 || i>L.length)
		return ERROR;
	m = L.elem[i - 1];
	return OK;
}

//查询(名字)
void Local(Sqlist L, char a[20]) {
	int m =-1;
	for (int i = 0; i < L.length; i++) {
		if (strcmp(L.elem[i].name, a) == 0) {
			m = i;
			printf("学号:%s\t成绩:%.1f",L.elem[i].no,L.elem[i].score);
		}
	}
	if(m==-1) {
		printf("该学生不存在!");
	}
}

//创建并添加学生
int Creat(Sqlist &L) {
	int n;
	printf("请输入您要初始化的学生信息(学号,姓名,成绩)顺序表的长度:");
	scanf("%d", &n);
	int i;
	for (i = 0; i < n; i++) {
		printf("请输入第 %d个学生的学号、名字、成绩:",i+1);
		scanf("%s %s %f", &L.elem[i].no, &L.elem[i].name, &L.elem[i].score);
	}
	L.length = i;
	return OK;
}

//删除
int Dele(Sqlist &L, int i, Student &e) {
	if (i<0 || i>L.length)
		return ERROR;
	e = L.elem[i - 1];
	for (int j = i - 1; j < L.length; j++) {

		L.elem[j] = L.elem[j + 1];
	}
	--L.length;
	return OK;
}

//插入
int Insert(Sqlist &L, int i, Student e) {
	if (i<0 || i>L.length)
		return ERROR;
	for(int j = L.length; j >=i; j--)
		L.elem[j] = L.elem[j-1];
	L.elem[i - 1] = e;
	++L.length;
	return OK;
}

//遍历顺序表
void Print(Sqlist L) {
	printf("=================================================\n");
	printf("学号\t姓名\t成绩\n");
	for (int i = 0; i < L.length; i++) {
		printf("%-5s %-5s %.1f\n", L.elem[i].no, L.elem[i].name, L.elem[i].score);
	}
	printf("=================================================");
}

int main() {
	Sqlist S;//顺序表
	Student e, k;//学生对象
	int j, i, m;//变量
	int loop = 1;//控制循环变量
	char a[20];//输入字符
	Init(S);//创建一个空表
	system("color f0");//系统颜色
	do {
		printf("\n  ┌─┐   ─┐     ");
		printf("   ★☆★☆★☆★☆★☆★☆★☆★\n");
		printf(" │※│ /※/       ");
		printf(" ☆                          ☆\n");
		printf(" │※│/※/        ");
		printf(" ★   1.初始化               ★\n");
		printf(" │※ /※/─┬─┐ ");
		printf("    ☆   2.检查顺序表是否为空   ☆\n");
		printf(" │※│※|※│※│ ");
		printf("   ★   3.遍历顺序表           ★\n");
		printf("┌┴─┴─┐-┘─┘ ");
		printf("        ☆   4.查询(位置)           ☆\n");
		printf("                   ☆   5.查询(名字)           ☆\n");
		printf("│※※※※│※※※│");
		printf("  ★   6.插入                 ★\n");
		printf("│※┌──┘※※※│");
		printf("     ☆   7.删除                 ☆\n");
		printf("└┐※※※※※※┌┘");
		printf("   ★   8.学生个数             ★\n");
		printf("                   ★   9.退出                 ★\n");
		printf(" └┐※※※※┌┘  ");
		printf("   ☆                          ☆\n");
		printf("  │※※※※│    ");
		printf(" ★☆★☆★☆★☆★☆★☆★☆★\n");
		printf("█▆ ▅ ▇ ▆ ▅ ▄▃ ▄ ▅ ▆ ▄ ▅ ▄ ▃ ▂ ▃ ▄ ▆ ▅ ▇ ▆ ▄ ▅█ ▇ ▆ ▄ ▂\n");
		printf("======================\n");
		printf(" 请输入您要进行的操作:\n");
		printf("======================\n");
		scanf("%d",&j);
		switch (j) {
			case 1://初始化学生信息
				Creat(S);
				break;

			case 2://检查顺序表是否为空
				Check(S);
				break;

			case 3://遍历学生信息表
				Print(S);
				break;

			case 4://根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
				printf("请输入要查询的位置:");
				int n;
				scanf("%d", &n);//接收用户输入
				Get(S, n, k);
				printf("%-5s %-5s %.1f\n", k.no, k.name, k.score);
				break;

			case 5://查询(名字)
				printf("请输入要查找学生的名字:");
				scanf("%s", a);
				Local(S,a);
				break;

			case 6://插入一个学生信息
				printf("请依次输入要插入学生的学号、名字、成绩、位置:\n");
				scanf("%s%s%f%d", &e.no, &e.name, &e.score, &i);//接收用户输入
				//插入操作
				Insert(S, i, e);
				break;

			case 7://删除一个学生信息
				printf("请输入要删除学生的位置:");
				int d;//删除的位置
				Student q;
				scanf("%d", &d);//接收用户输入
				//进行删除操作
				Dele(S, d, q);
				//告诉用户删除的学生信息
				printf("您删除的学生是:%s %s %f\n", q.no, q.name, q.score);
				break;
			case 8://统计学生个数
				printf("学生个数:%d",S.length);
				break;
			case 9:	//退出系统
				printf("你退出了系统.....");
				loop=0;//将loop置为0,while(loop)条件不成立,退出循环
		}
		printf("\n\n");//每次操作完换两行,对用户友好
	} while(loop);
}


2.链表

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
#define OK 1
#define ERROR 0
#define Maxlen 100
struct Data {								 
	int studentID;//学号 
	char studentName[20];//姓名 
	double studentScore;//成绩 
};
typedef Data DataType;
typedef struct StudentList {
	DataType data;
	struct StudentList *next;
};
//单链表初始化
StudentList * InitList(StudentList *h) {
	//创建头结点
	h=(StudentList *)malloc(sizeof(StudentList));
	if(h==NULL) {
		return 0;
	}
	h->next=NULL;
	return h;
}

//创建并添加学生
StudentList * InputList(StudentList *h) {
	StudentList *s,*r;
	int num;
	r=h;
	printf("请输入您要初始化的学生信息(学号,姓名,成绩)链表的长度:");
	scanf("%d",&num);
	for(int i=0; i<num; i++) {//循环输入学生信息 
		printf("请输入第%d个学生信息:\n",i+1);
		s=(StudentList*)malloc(sizeof(StudentList));
		printf("请输入学生学号:\n");
		scanf("%d",&s->data.studentID);
		printf("请输入学生姓名:\n");
		scanf("%s",&s->data.studentName);
		printf("请输入学生成绩:\n");
		scanf("%lf",&s->data.studentScore);
		r->next=s;
		r=s;
	}
	r->next=NULL;
	printf("创建成功!\n");
	return h;
}

//判断单链表是否为空
int ListEmpty(StudentList *h) {
	if(h->next==NULL) {
		return 1;
	} else {
		return 0;
	}
}

//遍历链表
void OutputList(StudentList *L) {
	printf("=================================================\n");
	printf("学号\t姓名\t成绩\n");
	StudentList *p;
	p=L->next;
	while(p!=NULL) {
		printf("%d\t%s\t%.2lf\n", p->data.studentID, p->data.studentName, p->data.studentScore);
		p=p->next;
	}
	printf("=================================================\n");
}
//插入学生信息
int InsertList(StudentList *L) {
	StudentList *p,*s;
	int num,j=0;
	p=L->next;
	printf("请输入新增学生的位置:\n");
	scanf("%d",&num);
	while(p->next!=NULL&&j<num-1) {
		p=p->next;
		j++;
	}
	if(j!=num-1) {
		printf("插入位置不存在\n");
		return 0;
	}

	s=(StudentList*)malloc(sizeof(StudentList));
	printf("请输入学生学号:\n");
	scanf("%d",&s->data.studentID);
	printf("请输入学生姓名:\n");
	scanf("%s",&s->data.studentName);
	printf("请输入学生成绩:\n");
	scanf("%lf",&s->data.studentScore);
	s->next=p->next;
	p->next=s;
	printf("新增成功\n");
	return 1;
}
//删除学生信息
int DeleteList(StudentList *L) {
	StudentList *r,*pre;
	int num,j=0;
	r=L->next;
	printf("请输入删除的学生学号:\n");
	scanf("%d",&num);
	while(r!=NULL) {
		if(r->data.studentID==num) {
			pre->next=r->next;
			free(r);
			printf("删除成功\n");
			return 1;
		}
		pre=r;
		r=r->next;
	}
	return 0;
}

// 查找(位置)
int SelectList(StudentList *L) {
	StudentList *r,*pre;
	int  num;
	r=L->next;
	printf("请输入查找学生的位置:\n");
	scanf("%d",&num);
	while(r!=NULL) {
		if(r->data.studentID==num) {//整形匹配,一样则打印信息 
			printf("学号\t姓名\t成绩\n");
			printf("%d\t%s\t%.2lf\n", r->data.studentID, r->data.studentName, r->data.studentScore);
			return 1;
		}
		//指针向后移 
		r=r->next;
	}
	//否则,提示链表中不存在此学生 
	printf("链表中不存在此学生!\n");
	return 0;
}
//查找(名字)
int SelectList2(StudentList *L) {
	StudentList *r,*pre;
	char name[20];
	r=L->next;
	printf("请输入查找学生的名字:\n");
	scanf("%s",&name);
	while(r!=NULL) {
		if(strcmp(r->data.studentName,name)==0) {//字符匹配,成功则打印信息 
			printf("学号\t姓名\t成绩\n");
			printf("%d\t%s\t%.2lf\n", r->data.studentID, r->data.studentName, r->data.studentScore);
			return 1;
		}
		//指向下一个节点 
		r=r->next;
	}
	//否则,提示链表中不存在此学生 
	printf("不存在此学生!\n");
	return 0;
}
int main() {
	StudentList *h;
	StudentList *L=NULL;
	DataType e;
	int n,loop=1;//n为用户选择操作数,loop为控制循环变量 
	int count = 0;//学生个数
	h=InitList(h);//创建一个空链表 
	system("color f0");//系统颜色
	do {
		printf("\n  ┌─┐   ─┐     ");
		printf("   ★☆★☆★☆★☆★☆★☆★☆★\n");
		printf(" │※│ /※/       ");
		printf(" ☆                          ☆\n");
		printf(" │※│/※/        ");
		printf(" ★   1.初始化               ★\n");
		printf(" │※ /※/─┬─┐ ");
		printf("    ☆   2.检查链表是否为空     ☆\n");
		printf(" │※│※|※│※│ ");
		printf("   ★   3.遍历链表             ★\n");
		printf("┌┴─┴─┐-┘─┘ ");
		printf("        ☆   4.查询(位置)           ☆\n");
		printf("                   ☆   5.查询(名字)           ☆\n");
		printf("│※※※※│※※※│");
		printf("  ★   6.插入                 ★\n");
		printf("│※┌──┘※※※│");
		printf("     ☆   7.删除                 ☆\n");
		printf("└┐※※※※※※┌┘");
		printf("   ★   8.学生个数             ★\n");
		printf("                   ★   9.退出                 ★\n");
		printf(" └┐※※※※┌┘  ");
		printf("   ☆                          ☆\n");
		printf("  │※※※※│    ");
		printf(" ★☆★☆★☆★☆★☆★☆★☆★\n");
		printf("█▆ ▅ ▇ ▆ ▅ ▄▃ ▄ ▅ ▆ ▄ ▅ ▄ ▃ ▂ ▃ ▄ ▆ ▅ ▇ ▆ ▄ ▅█ ▇ ▆ ▄ ▂\n");
		printf("======================\n");
		printf(" 请输入您要进行的操作:\n");
		printf("======================\n");
		scanf("%d",&n);
		switch(n) {
			case 1://用户输入学生信息
				L=InputList(h);
				break;
			case 2://判断表是否为空
				if(ListEmpty(h)==1) {
					printf("链表为空!");
				} else {
					printf("链表不为空");
				}
				break;
			case 3://遍历学生信息表
				OutputList(L);
				break;
			case 4://查询(位置)
				SelectList(L);
				break;
			case 5://查询(名字)
				SelectList2(L);
				break;
			case 6://插入一个学生信息
				InsertList(L);
				break;
				break;
			case 7://删除一个学生信息
				DeleteList(L);
				break;
			case 8://统计学生个数
				StudentList *p;
				p=L->next;
				while(p!=NULL) {//遍历链表 
					count++;
					p=p->next;
				}
				printf("学生个数:%d",count);
				break;
			case 9://退出系统
				loop=0;
				printf("你退出了系统......");
				break;
		}
		printf("\n\n");//每次操作完换两行,对用户友好
	} while(loop);
}


举报

相关推荐

0 条评论