程序实现目标
1.对学生信息(学号、姓名、成绩)进行统一管理,实现增、删、改、查、显。
2.学习链表的编写模式。
1.数据结构体的定义
typedef struct Student{
char name[30]; //姓名
int age; //年龄
int id;//学号
int score;//分数
char caeer[30];//专业
int class_grade;//班级
struct Student *next;//指针域
}student;
2. 基本函数的申明
初始化创建链表 student *init_sxlianbiao(/*student *p,*/int num);
//num表示创建的节点数量
增加节点 student *insertNode(student *p/*,int add*/);
//add 表示插入的节点位置,这里可以不用声明,在函数里面输入即可
删除节点 student *delNode(student *p/*,int add*/);
//add 表示删除的节点位置,这里可以不用声明,在函数里面输入即可
查找节点 int selectNode();
修改节点 student *amendNode(student *p/*,int add, int new_data*/);
//add 表示修改的节点位置,new_data表示修改的数据 这里可以不用声明, 在函数里面输入即可
打印节点 void display();
2.1初始化创建链表
student *init_sxlianbiao(int num){
//由于形参已经创建了头结点student *p 函数内部就不用在声明定义头结点,
student *p;//创建了头结点
student *head; //创建头指针
student *temp; // 创建临时指针
p=(student*)malloc(sizeof (student)); //为头结点开辟空间
head=p; //头指针,指向头结点
temp=p;//临时指针,指向头结点
p->next=NULL;// 开始定义头结点的指针域,为NULL 创建链表完成,只有一个头指针和一个头结点(由于头结点的数据域可以不用存储参数,这里可以先不用定义)
for(i=0;i<num;i++)
{
student *new_student; //定义新节点
new_student =(student*)malloc(sizeof (student));//为新节点开辟空间
strcpy(new_student->name,name_data[i]);//为新节点的数据域里面的name参数赋值
strcpy(new_student->caeer,caeer_data[i]);//为新节点的数据域里面的caeer参数赋值
new_student->age=age_data[i]; //为新节点的数据域里面的age参数赋值
new_student->class_grade=class_grade_data[i];//为新节点的数据域里面的class_grade参数赋值
new_student->id=id_data[i]; //为新节点的数据域里面的id参数赋值
new_student->score=score_data[i]; //为新节点的数据域里面的score参数赋值
new_student->next=NULL;//节点的指针域 为NULL,创建新节点完成
temp->next=new_student; //临时指针与新节点关联,指针域,指向新节点
temp=temp->next; //将临时指针,指向新节点(也就是每次循环,都让临时指针,指向新节点) 也可以写成 temp=new_student
}
return head;
}
2.2增加(插入)节点
student *insertNode(student *p){
student *temp=p; //创建临时指针,指向头结点,便于遍历链表
student *c; //创建插入的节点
c=(student*)malloc(sizeof(student)); //为节点开辟空间
printf("请输入插入学生的位置——插入节点位置\n");
scanf("%d",&add); //输入需要插入的位置
for(i=0;i<add;i++) //找到需要插入(增加)节点的前一个节点
{
if(temp==NULL)
//判断当需要插入的位置add如果超链表范围 即temp指针指向为NULL
//for循环中当超范围时 temp指向会为null
{
printf("插入位置超范围——请重新输入\n");
return p;
}
temp=temp->next;//temp指针指向最后一个节点(即temp->next指向插入点的前一个节点)
}
printf("输入插入姓名\n");
scanf("%s",&c->name);
printf("请输入插入学生的年龄\n");
scanf("%d",&c->age);
printf("请输入插入学生的学号\n");
scanf("%d",&c->id);
printf("请输入插入学生的班级1-3\n");
scanf("%d",&c->class_grade);
printf("请输入插入学生的分数0-100\n");
scanf("%d",&c->score);
printf("请输入插入学生的专业\n");
scanf("%s",&c->caeer);
//循环到add的前一个节点
//比如a,b中间插入
//即a->next要指向插入的节点C
// c节点 c->next要指向b 节点
//循环执行后temp-next等同于a->next 指向b(插入节点的后面一个节点)
//即c->next=temp-next;
// 然后a->temp要指向插入的节点,即a->next=c
//即temp->next=c;
c->next=temp->next;
temp->next=c;
num++;
return p;
}
2.3删除节点
//删除节点 删除节点学生信息
student *delNode(student *p/*,int add*/){
student *temp=p;//创建临时指针,重新指向头结点
student *del;//创建一个删除的节点,防止丢失
printf("请输入需要删除的学生节点\n");
scanf("%d",&add);
//找到要删除节点的前一个节点
for(i=0;i<add;i++)
{
temp=temp->next;
//temp指针指向最后一个节点(即temp->next指向删除节点)
}
//单独设置一个指针 指向被删除的节点,以防丢失
del=temp->next;
//删除某个节点的方法就是更改前一个结点的指针域
//删除前一个节点的指针域temp-next 指向删除节点的后一个节点
// 也就是删除节点指针域,即temp->next->next;
temp->next=temp->next->next;
// 手动释放该节点,防止内存泄漏
free(del);// del指向删除的节点地址,即释放del就可以
num--;
return p;
}
2.4查找节点
//查找节点数据,,查找学生信息
int selectNode(student *p){
student *temp=p;
m=1;
printf("请输入查询的条件 1—姓名 2—学号\n ");
scanf("%d",&elem);
switch(elem){
case 1 : printf("请输入查询的学生姓名\n");
scanf("%s",&cx_name);
while(temp->next)
{
temp=temp->next;
b=strcmp(temp->name,cx_name);
if(b==0)
{
printf("学生姓名找到了!\n");
printf("在第%d节点位置\n",m);
return m;
}
m++;
}
printf("没查询到该节点学生的姓名信息\n");
break;
case 2: printf("请输入查询学生的学号\n");
scanf("%d",&cx_id);
while(temp->next)
{
temp=temp->next;
if(temp->id==cx_id)
{
printf("学生学号找到了!\n");
printf("在第%d节点位置\n",m);
return m;
}
m++;
}
printf("没查询到该节点学生的学号信息\n");
break;
default: printf("查询数据输入错误,请重新输入\n");
break;
}
return -1;//未查询到数据 非正常结束函数
}
2.5修改节点
//修改节点数据域 修改学生信息
student *amendNode(student *p/*,int add, int new_data*/){
student *temp;
temp=p;
printf("请输入需要修改学生的位置--需要修改的节点\n");
scanf("%d",&add);
for(i=0;i<add;i++)//找到需要修改节点的前一个节点
{
temp=temp->next;
}
printf("请输入需要改的内容:1—姓名 2—年龄 3—学号 4—班级 5—分数 6—专业 7-全部修改\n");
scanf("%d",&elem);
switch(elem)
{
case 1: printf("请输入修改的姓名\n");
scanf("%s",&temp->name);
break;
case 2: printf("请输入修改的年龄\n");
scanf("%d",temp->age);
break;
case 3: printf("请输入修改的学号\n");
scanf("%d",temp->id);
break;
case 4: printf("请输入修改的班级\n");
scanf("%d",&temp->class_grade);
break;
case 5: printf("请输入修改的分数\n");
scanf("%d",&temp->score);
break;
case 6: printf("请输入修改的专业\n");
scanf("%s",&temp->caeer);
break;
case 7: printf("请输入修改的姓名\n");
scanf("%s",&temp->name);
printf("请输入修改的年龄\n");
scanf("%d",temp->age);
printf("请输入修改的学号\n");
scanf("%d",temp->id);
printf("请输入修改的班级\n");
scanf("%d",&temp->class_grade);
printf("请输入修改的分数\n");
scanf("%d",&temp->score);
printf("请输入修改的专业\n");
scanf("%s",&temp->caeer);
break;
default : printf("输入错误,请重新输入\n");
//return p;
break;
}
return p;
}
2.6打印输出链表
//遍历输出链表 输出所有学生信息
void display(student *p){
student *temp;
temp=p;
while(temp->next)
{
temp=temp->next;
printf("姓名:%s,年龄:%d,学号:%d,班级:%d,分数:%d,专业:%s\n",temp->name,temp->age,temp->id,temp->class_grade,temp->score,temp->caeer);
}
printf("链表节点数量=%d\n",num);
}
3.全部代码
3.1主函数 ___.cpp
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"lsf_xs.c"
int main(){
int a;
system("color b");
//student *init_sxlianbiao(student *p,int num);
student *p=init_sxlianbiao(num);//创建链表P 节点数量20
//display(p);
while(a!=0){
printf("------------------------------------------\n");
printf("〓〓〓〓★☆ 学生信息管理系统 ☆★〓〓〓〓\n");
printf(" \n");
printf(" 作者微信:15221624218 \n");
printf(" \n");
printf(" 欢迎交流咨询~ \n");
printf(" \n");
printf(" 1.增加学生信息 2.删除学生信息 \n");
printf(" \n");
printf(" 3.修改学生信息 4.查找学生信息 \n");
printf(" \n");
printf(" 5.显示所有信息 0.退出管理系统 \n");
printf(" \n");
printf("------------------------------------------\n");
printf("请选择:");
scanf("%d",&a);
if(a>=0&&a<=5)
{
switch (a){
case 0 : printf("退出管理系统\n"); break ;
case 1 : p=insertNode(p); break;//插入节点 学生信息
case 2 : p=delNode(p);break;//删除节点 删除学生信息
case 3 : p=amendNode(p);break;//修改节点数据域 修改学生信息
case 4 : selectNode(p);break;//在P链表中查找节点,查找学生信息
case 5 : display (p);break;//在P链表中输出遍历链表 显示所有信息
}
}
else {
printf("输入错误————返回重新输入\n");
system("pause");
}
}
system("pause");
return 0;
}
3.2 lsf_xs.c 文件
#include "lsf_xs.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int i,m,b;
int add;
int elem;
char cx_name[30];
int cx_id;
//创建链表
student *init_sxlianbiao(int num){
//由于形参已经创建了头结点student *p 函数内部就不用在声明定义头结点,
student *p;//创建了头结点
student *head; //创建头指针
student *temp; // 创建临时指针
p=(student*)malloc(sizeof (student)); //为头结点开辟空间
head=p; //头指针,指向头结点
temp=p;//临时指针,指向头结点
p->next=NULL;// 开始定义头结点的指针域,为NULL 创建链表完成,只有一个头指针和一个头结点(由于头结点的数据域可以不用存储参数,这里可以先不用定义)
for(i=0;i<num;i++)
{
student *new_student; //定义新节点
new_student =(student*)malloc(sizeof (student));//为新节点开辟空间
strcpy(new_student->name,name_data[i]);//为新节点的数据域里面的name参数赋值
strcpy(new_student->caeer,caeer_data[i]);//为新节点的数据域里面的caeer参数赋值
new_student->age=age_data[i]; //为新节点的数据域里面的age参数赋值
new_student->class_grade=class_grade_data[i];//为新节点的数据域里面的class_grade参数赋值
new_student->id=id_data[i]; //为新节点的数据域里面的id参数赋值
new_student->score=score_data[i]; //为新节点的数据域里面的score参数赋值
new_student->next=NULL;//节点的指针域 为NULL,创建新节点完成
temp->next=new_student; //临时指针与新节点关联,指针域,指向新节点
temp=temp->next; //将临时指针,指向新节点(也就是每次循环,都让临时指针,指向新节点) 也可以写成 temp=new_student
}
return head;
}
//插入(增加)节点 插入学生信息
student *insertNode(student *p){
student *temp=p; //创建临时指针,指向头结点,便于遍历链表
student *c; //创建插入的节点
c=(student*)malloc(sizeof(student)); //为节点开辟空间
printf("请输入插入学生的位置——插入节点位置\n");
scanf("%d",&add); //输入需要插入的位置
for(i=0;i<add;i++) //找到需要插入(增加)节点的前一个节点
{
if(temp==NULL)
//判断当需要插入的位置add如果超链表范围 即temp指针指向为NULL
//for循环中当超范围时 temp指向会为null
{
printf("插入位置超范围——请重新输入\n");
return p;
}
temp=temp->next;//temp指针指向最后一个节点(即temp->next指向插入点的前一个节点)
}
printf("输入插入姓名\n");
scanf("%s",&c->name);
printf("请输入插入学生的年龄\n");
scanf("%d",&c->age);
printf("请输入插入学生的学号\n");
scanf("%d",&c->id);
printf("请输入插入学生的班级1-3\n");
scanf("%d",&c->class_grade);
printf("请输入插入学生的分数0-100\n");
scanf("%d",&c->score);
printf("请输入插入学生的专业\n");
scanf("%s",&c->caeer);
//循环到add的前一个节点
//比如a,b中间插入
//即a->next要指向插入的节点C
// c节点 c->next要指向b 节点
//循环执行后temp-next等同于a->next 指向b(插入节点的后面一个节点)
//即c->next=temp-next;
// 然后a->temp要指向插入的节点,即a->next=c
//即temp->next=c;
c->next=temp->next;
temp->next=c;
num++;
return p;
}
//修改节点数据域 修改学生信息
student *amendNode(student *p/*,int add, int new_data*/){
student *temp;
temp=p;
printf("请输入需要修改学生的位置--需要修改的节点\n");
scanf("%d",&add);
for(i=0;i<add;i++)//找到需要修改节点的前一个节点
{
temp=temp->next;
}
printf("请输入需要改的内容:1—姓名 2—年龄 3—学号 4—班级 5—分数 6—专业 7-全部修改\n");
scanf("%d",&elem);
switch(elem)
{
case 1: printf("请输入修改的姓名\n");
scanf("%s",&temp->name);
break;
case 2: printf("请输入修改的年龄\n");
scanf("%d",temp->age);
break;
case 3: printf("请输入修改的学号\n");
scanf("%d",temp->id);
break;
case 4: printf("请输入修改的班级\n");
scanf("%d",&temp->class_grade);
break;
case 5: printf("请输入修改的分数\n");
scanf("%d",&temp->score);
break;
case 6: printf("请输入修改的专业\n");
scanf("%s",&temp->caeer);
break;
case 7: printf("请输入修改的姓名\n");
scanf("%s",&temp->name);
printf("请输入修改的年龄\n");
scanf("%d",temp->age);
printf("请输入修改的学号\n");
scanf("%d",temp->id);
printf("请输入修改的班级\n");
scanf("%d",&temp->class_grade);
printf("请输入修改的分数\n");
scanf("%d",&temp->score);
printf("请输入修改的专业\n");
scanf("%s",&temp->caeer);
break;
default : printf("输入错误,请重新输入\n");
//return p;
break;
}
return p;
}
//查找节点数据,,查找学生信息
int selectNode(student *p){
student *temp=p;
m=1;
printf("请输入查询的条件 1—姓名 2—学号\n ");
scanf("%d",&elem);
switch(elem){
case 1 : printf("请输入查询的学生姓名\n");
scanf("%s",&cx_name);
while(temp->next)
{
temp=temp->next;
b=strcmp(temp->name,cx_name);
if(b==0)
{
printf("学生姓名找到了!\n");
printf("在第%d节点位置\n",m);
return m;
}
m++;
}
printf("没查询到该节点学生的姓名信息\n");
break;
case 2: printf("请输入查询学生的学号\n");
scanf("%d",&cx_id);
while(temp->next)
{
temp=temp->next;
if(temp->id==cx_id)
{
printf("学生学号找到了!\n");
printf("在第%d节点位置\n",m);
return m;
}
m++;
}
printf("没查询到该节点学生的学号信息\n");
break;
default: printf("查询数据输入错误,请重新输入\n");
break;
}
return -1;//未查询到数据 非正常结束函数
}
//删除节点 删除节点学生信息
student *delNode(student *p/*,int add*/){
student *temp=p;//创建临时指针,重新指向头结点
student *del;//创建一个删除的节点,防止丢失
printf("请输入需要删除的学生节点\n");
scanf("%d",&add);
//找到要删除节点的前一个节点
for(i=0;i<add;i++)
{
temp=temp->next;
//temp指针指向最后一个节点(即temp->next指向删除节点)
}
//单独设置一个指针 指向被删除的节点,以防丢失
del=temp->next;
//删除某个节点的方法就是更改前一个结点的指针域
//删除前一个节点的指针域temp-next 指向删除节点的后一个节点
// 也就是删除节点指针域,即temp->next->next;
temp->next=temp->next->next;
// 手动释放该节点,防止内存泄漏
free(del);// del指向删除的节点地址,即释放del就可以
num--;
return p;
}
//遍历输出链表 输出所有学生信息
void display(student *p){
student *temp;
temp=p;
while(temp->next)
{
temp=temp->next;
printf("姓名:%s,年龄:%d,学号:%d,班级:%d,分数:%d,专业:%s\n",temp->name,temp->age,temp->id,temp->class_grade,temp->score,temp->caeer);
}
printf("链表节点数量=%d\n",num);
}
3.3 lsf_xs.h 头文件
#ifndef _LSF_XS_H_
#define _LSF_XS_H_
extern int age_data[]={19,18,16,22,24,23,28,25,21,19,17,22,21,23,20,25,23,20,19,17};
extern int score_data[]={99,100,93,94,88,69,60,39,50,88,87,83,83,86,81,78,77,67,98,72};
extern int id_data[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
extern int class_grade_data[]={1,2,3,1,3,2,1,3,1,3,1,2,3,2,1,1,2,1,1,2};
extern char *caeer_data[]={"机电技术","电子信息","电气工程","软件工程","网络工程","机电技术","电子信息","电气工程","软件工程","网络工程","机电技术","电子信息","电气工程","软件工程","网络工程","机电技术","电子信息","电气工程","软件工程","网络工程"};
extern char *name_data[]={"李一","张一","赵一","刘一","王一","李二","张二","赵二","刘二","王二","李三","张三","赵三","刘三","王三","李四","张四","赵四","刘四","王四"};
int num=20;
typedef struct Student{
char name[30];
int age;
int id;
int score;
char caeer[30];
int class_grade;
struct Student *next;
}student;
//创建链表
student *init_sxlianbiao(/*student *p,*/int num);
//插入(增加)节点
student *insertNode(student *p/*,int add*/);
//查找节点
int selectNode();
//修改节点数据域
student *amendNode(student *p/*,int add, int new_data*/);
//删除节点
student *delNode(student *p/*,int add*/);
//遍历输出链表
void display();
#endif
4.界面显示
功能可以全部实现。