2022-7-23作业,用链表来实现学生信息系统的增删改查

先是函数的各个申明

#ifndef __DOUBLELINK_H__
#define __DOUBLELINK_H__

typedef struct student //学生信息结构体
{
	char name[20];
	int id;
	int score;
};
typedef  int datatype;
typedef struct Node
{
	union
	{
		datatype data;
		int len;
		struct student stu;		
	};
	struct Node *next;  //指向后继
	struct Node *prio;  //指向前驱
}Doublelink;
/*
//创建
Doublelink *list_create();
//判空
int list_empty();
//申请节点函数
Doublelink *node_buy(char *name,int id,int score);
//头插
int list_insert_head(Doublelink *D,char *name,int id,int score);
//遍历
void list_show(Doublelink *D);
//按照位置返回节点
Doublelink *list_search_pos(Doublelink *D,int pos);
//尾插
int list_insert_tail(Doublelink *D,datatype e);
//任意插入
int list_insert_pos(Doublelink *D,int pos,char *name,int id,int score);
//头删
int list_delete_head(Doublelink *D);
//尾删
int list_delete_tail(Doublelink *D);
//任意删
int list_delete_pos(Doublelink *D,int pos);
//释放
void list_free(Doublelink *D);
*/

//创建
Doublelink *list_create();
//判空
int list_empty()
//头插
int list_insert_head(Doublelink *D,char *name,int id,int score);
//任意插入
int list_insert_pos(Doublelink *D,int pos,char *name,int id,int score);
//任意删
int list_delete_pos(Doublelink *D,int pos);
//遍历
void list_show(Doublelink *D);
//查找学生信息
int list_search_value(Doublelink *D,int id);
//修改学生信息
int list_updata_value(Doublelink *D,int old,char *name,int id,int score);
#endif

然后是各个函数的代码块

 

#include<stdio.h>
#include<stdlib.h>
#include"./doublelink.h"
#include<string.h>
//创建
Doublelink *list_create()
{
	Doublelink *D=(Doublelink*)malloc(sizeof(Doublelink));
	if(NULL==D)
	{
		printf("创建失败\n");
		return NULL;
	}
	//初始化
	D->len=0;
	D->prio=NULL;
	D->next=NULL;
	printf("创建成功\n");
	return D;


}
//判空
int list_empty(Doublelink *D)
{
	if(NULL == D)
	{
		printf("所给链表不合法\n");
		return -1;
	}
	return D->next ==NULL ? 1:0; //1表示空 0表示非空
}
//申请节点函数
Doublelink *node_buy(char *name ,int id ,int score)
{
	Doublelink *p=(Doublelink*)malloc(sizeof(Doublelink));
	if(NULL == p)
	{
		printf("节点申请失败\n");
		return NULL;
	}
	//将数据存入借点
	strcpy(p->stu.name,name);
	p->stu.id=id;
	p->stu.score=score;
	p->prio =NULL;
	p->next =NULL;
	return p;


}
//头插
int list_insert_head(Doublelink *D,char *name ,int id, int score)
{
	Doublelink *p=node_buy(name,id,score);
	//判断链表
	if(NULL ==D)
	{
		printf("表不合法\n");
		return -1;
	}
	if(list_empty(D))  //空链表头插
	{
		p->prio=D;
		D->next=p;
	}else 				//非空链表头插
	{
		p->next=D->next;
		p->prio =D;
		D->next->prio=p;
		D->next=p;
	
	}
	D->len++;  //表的变化
	printf("插入成功\n");

}
//遍历
void list_show(Doublelink *D)
{
	//判断逻辑
	if(NULL == D || list_empty(D))
	{
		printf("遍历失败\n");
		return ;
	}
	//遍历
	printf("链表元素分别是\n");
	printf("姓名\t学号\t成绩\n");
	Doublelink *q=D->next;
	while(q != NULL)
	{
		printf("%s\t",q->stu.name);
		printf("%d\t",q->stu.id);
		printf("%d\t",q->stu.score);
		q=q->next;
		printf("\n");
	}
	printf("\n");

}
//按照位置返回节点
/*Doublelink *list_search_pos(Doublelink *D,int pos)
{
	//判断逻辑
	if(NULL == D || list_empty(D))
	{
		printf("定位失败\n");
		return NULL;
	}
	//查找
	Doublelink *q = D->next;
	for(int i=1;i<pos;i++)
	{
		q=q->next;
	}
	return q;

}*/
//尾插
/*int list_insert_tail(Doublelink *D,e)
{
	Doublelink *p=node_buy(e);
	//判断逻辑
	if(NULL==p)
	{
		printf("链表不合法\n");
		return -1;
	}
	//判断链表
	if(NULL ==D)
	{
		printf("表不合法\n");
		return -1;
	}
	if(list_empty(D))  //空链表头插
	{
		p->prio=D;
		D->next=p;
	}else 				//非空链表头插
	{
		p->next=D->next;
		p->prio =D;
		D->next->prio=p;
		D->next=p;
	
	}
	D->len++;  //表的变化
	printf("插入成功\n");


}*/
//任意插入
int list_insert_pos(Doublelink *D,int pos,char *name,int id,int score)
{
	//判断逻辑
	if(NULL==D || list_empty(D) || pos<=0 || pos>D->len)
	{
		printf("插入失败\n");
		return -1;
	}
	//插入
	Doublelink *q=list_search_pos(D,pos);
	Doublelink *p=node_buy(name,id,score);
	p->next=q;
	p->prio=q->prio;
	q->prio->next=p;
	q->prio=p;
	//表的变化
	D->len++;
	printf("插入成功\n");
	return 0;
}
//头删
/*int list_delete_head(Doublelink *D)
{
	//判断逻辑
	if(NULL== D || list_empty(D))
	{
		printf("链表不合法\n");
		return -1;
	}
	//头删逻辑
	Doublelink *p=D->next;
	D->next=p->next;
	p->next=D;
	D->len--;
	printf("头删成功\n");
}*/
//尾删
/*int list_delete_tail(Doublelink *D)
{
	//判断逻辑
	if(NULL == D || list_empty(D))
	{
		printf("链表错误\n");
		return -1;
	}
	Doublelink *p=D->next;

	while(p->next->next != NULL)
	{
		p=p->next;
	}
	Doublelink *q=p->next;
	p->next=NULL;
	free(q);
	q=NULL;
	printf("尾删成功\n");
	D->len--;

}*/


//任意删
int list_delete_pos(Doublelink *D,int pos)
{
	//判断逻辑
	//任意插入
	Doublelink *q=list_search_pos(D,pos);
	if(NULL==q->next)
	{
		q->prio->next=NULL;
		free(q);
		q=NULL;
	}else
	{
		q->prio->next=q->next;
		q->next->prio=q->prio;
		free(q);
		q=NULL;
	}
	D->len--;
	printf("删除成功\n");
}
//释放
/*void list_free(Doublelink *D)
{
}*/

//修改学生信息
int list_updata_value(Doublelink *D,int old,char *name,int id,int score)
{
	Doublelink *p=D;
	for(int i=0;i<D->len;i++)
	{
		if(p->stu.id==old)
		{
			strcpy(p->stu.name,name);
			p->stu.id=id;
			p->stu.score=score;
		}
		p=p->next;
	}
	printf("修改成功\n");
}

//查找学生信息
int list_search_value(Doublelink *D,int id)
{
	int flag=0;
	//判断逻辑
	if(NULL==D || list_empty(D))
	{
		printf("查找失败\n");
		return -1;
	}
	//查找逻辑 
	Doublelink *q = D->next;
	for(int i=1;i<=D->len;i++)
	{
	
		if(q->stu.id== id)
		{
			printf("该学生是这个班的,叫%s,对应的成绩为%d\n",q->stu.name,q->stu.score);
			flag=1;
		}
		
		q=q->next;
	}
	if(flag == 0)
	{
		printf("无查找结果\n");
	}
	return 0;

}

最后是主函数调用部分

 

#include<stdio.h>
#include<stdlib.h>
#include"./doublelink.h"
int main(int argc, const char *argv[])
{ 
	int num;
	Doublelink *D = list_create();
	if(NULL==D)
	{
		return -1;
	}
	//list_insert_head(D,"dss",2,99);
	//list_insert_head(D,"ds",3,99);
	//list_insert_head(D,"d",7,99);

	while(1)
	{
		printf("                  学生成绩管理系统\n");
		printf("                  1.学生信息输入\n");
		printf("                  2.学生信息遍历\n");
		printf("                  3.添加学生信息\n");
		printf("                  4.删除学生信息\n");
		printf("                  5.修改学生信息\n");
		printf("                  6.查找学生信息\n");
		printf("                  0.退出学生信息管理系统\n");
		printf("请输入你需要的功能\n");
		scanf("%d",&num);
		switch(num)
		{
		case 1:
			{ 
				int n;
				char name[20];
				int id;
				int score;
				printf("请输入存放的学生个数:>>");
				scanf("%d",&n);
				for(int i=0;i<n;i++)
				{
					printf("请输入姓名:>>\n");
					scanf("%s",name);
					printf("请输入学号:>>\n");
					scanf("%d",&id);
					printf("请输入成绩:>>\n");
					scanf("%d",&score);
					list_insert_head(D,name,id,score);
					

				}
	
				break;
			}
		case 2:
			{
				list_show(D);
				break;
			}
		case 3:
			{ 
				int n;
				char name[20];
				int id;
				int score;
				printf("请输入你想添加的位置:>>\n");
				scanf("%d",&n);
				printf("请输入姓名:>>\n");
				scanf("%s",name);
				printf("请输入学号:>>\n");
				scanf("%d",&id);
				printf("请输入成绩:>>\n");
				scanf("%d",&score);
				list_insert_pos(D,n,name,id,score);
				list_show(D);
				break;
			
			}
		
		
		case 4:
			{
				int n;
				printf("请输入你要删除的学生的位置:>>\n");
				scanf("%d",&n);
				list_delete_pos(D,n);
				break;
			}
		case 5:
			{
				int n;
				char name[20];
				int id;
				int score;
				printf("请输入要修改的学生的学号:>>");
				scanf("%d",&n);
				printf("请输入姓名:>>\n");
				scanf("%s",name);
				printf("请输入学号:>>\n");
				scanf("%d",&id);
				printf("请输入成绩:>>\n");
				scanf("%d",&score);
				list_updata_value(D,n,name,id,score);
				break;
			
			}
		case 6:
			{
				int n;
				printf("请输入要查找的学生学号:>>");
				scanf("%d",&n);
				list_search_value(D,n);
				break;
			
			}
		case 0:
			{
				exit(0);
			}
		}
	}
	

	//调用头插函数
/*	list_insert_head(D,"hfy",1,90);
	list_insert_head(D,"lll",2,66);
	list_insert_head(D,"dsa",3,80);
	list_show(D);
	//调用尾插
//	list_insert_tail(D,777);
//	list_show(D);
	
	
	//调用任意插
	list_insert_pos(D,1,"lk",5,95);
	list_show(D);

	//调用头删
	list_delete_head(D);
	list_show(D);
	//调用尾删
//	list_delete_tail(D);
//	list_show(D);
	
	//调用任意删
	list_delete_pos(D,3);
	list_show(D);
	
*/	
	return 0;
}
u

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是用链表实现学生成绩管理系统的增删改查代码: ```c++ #include<iostream> #include<cstring> using namespace std; struct student{ int id; //学号 string name; //姓名 float score; //成绩 student *next; //指向下一个节点的指针 }; class StudentList{ public: StudentList(){ head = NULL; } ~StudentList(){ student *p = head; while(p){ student *q = p->next; delete p; p = q; } head = NULL; } void Create(); //创建链表 void Insert(); //插入节点 void Delete(); //删除节点 void Modify(); //修改节点 void Search(); //查找节点 void Display(); //显示链表 private: student *head; //头节点 }; void StudentList::Create(){ int n; cout<<"请输入学生人数:"<<endl; cin>>n; head = new student; //创建头节点 head->next = NULL; student *p = head; //p指向尾节点 for(int i=0;i<n;i++){ student *s = new student; //创建新节点 cout<<"请输入第"<<i+1<<"个学生的信息:"<<endl; cout<<"学号:"<<endl; cin>>s->id; cout<<"姓名:"<<endl; cin>>s->name; cout<<"成绩:"<<endl; cin>>s->score; s->next = NULL; p->next = s; //尾插法插入新节点 p = s; } cout<<"创建链表成功!"<<endl; } void StudentList::Insert(){ student *s = new student; //创建新节点 cout<<"请输入要插入的学生信息:"<<endl; cout<<"学号:"<<endl; cin>>s->id; cout<<"姓名:"<<endl; cin>>s->name; cout<<"成绩:"<<endl; cin>>s->score; s->next = NULL; student *p = head; while(p->next){ if(p->next->id > s->id){ //找到插入位置 s->next = p->next; p->next = s; cout<<"插入成功!"<<endl; return; } p = p->next; } p->next = s; //尾插法插入新节点 cout<<"插入成功!"<<endl; } void StudentList::Delete(){ int id; cout<<"请输入要删除的学生学号:"<<endl; cin>>id; student *p = head; while(p->next){ if(p->next->id == id){ //找到要删除的节点 student *q = p->next; p->next = q->next; delete q; cout<<"删除成功!"<<endl; return; } p = p->next; } cout<<"未找到该学生!"<<endl; } void StudentList::Modify(){ int id; cout<<"请输入要修改学生学号:"<<endl; cin>>id; student *p = head; while(p->next){ if(p->next->id == id){ //找到要修改的节点 cout<<"请输入新的学生信息:"<<endl; cout<<"学号:"<<endl; cin>>p->next->id; cout<<"姓名:"<<endl; cin>>p->next->name; cout<<"成绩:"<<endl; cin>>p->next->score; cout<<"修改成功!"<<endl; return; } p = p->next; } cout<<"未找到该学生!"<<endl; } void StudentList::Search(){ int id; cout<<"请输入要查找的学生学号:"<<endl; cin>>id; student *p = head; while(p->next){ if(p->next->id == id){ //找到要查找的节点 cout<<"学号:"<<p->next->id<<endl; cout<<"姓名:"<<p->next->name<<endl; cout<<"成绩:"<<p->next->score<<endl; return; } p = p->next; } cout<<"未找到该学生!"<<endl; } void StudentList::Display(){ student *p = head->next; while(p){ cout<<"学号:"<<p->id<<"\t姓名:"<<p->name<<"\t成绩:"<<p->score<<endl; p = p->next; } } int main(){ StudentList l; int choice; while(true){ cout<<"-----------------"<<endl; cout<<"1.创建链表"<<endl; cout<<"2.插入节点"<<endl; cout<<"3.删除节点"<<endl; cout<<"4.修改节点"<<endl; cout<<"5.查找节点"<<endl; cout<<"6.显示链表"<<endl; cout<<"0.退出程序"<<endl; cout<<"-----------------"<<endl; cout<<"请输入您的选择:"<<endl; cin>>choice; switch(choice){ case 1: l.Create(); break; case 2: l.Insert(); break; case 3: l.Delete(); break; case 4: l.Modify(); break; case 5: l.Search(); break; case 6: l.Display(); break; case 0: return 0; default: cout<<"输入有误,请重新输入!"<<endl; break; } } return 0; } ``` 这个程序实现了一个简单的学生成绩管理系统,可以通过命令行菜单进行增删改查等操作。其中,链表的每个节点包含了学生的学号、姓名和成绩等信息,并且可以进行动态的插入、删除和修改操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值