1.头文件和预处理2.定义学生结构体的数据结构3.定义每条记录或节点的数据结构4.函数接口代码.
1.定义提示菜单2.增加学生记录3.输入学号接口·4.遍历表中学生5.增加学生记录6.删除学生信息7.查找学生信息8.修改学生信息9.统计学生人数10.清空链表 5.main函数6.总源码(可直接复制运行)7.测试结果
1.头文件和预处理#include2.定义学生结构体的数据结构#include #include #include #include #include using namespace std; #define NO_LENGTH 20 #define NAME_LENGTH 11
typedef struct Student{
char studentNo[NO_LENGTH];
char studentName[NAME_LENGTH];
int score;
}st;
3.定义每条记录或节点的数据结构
typedef struct node
{
struct Student data; //数据域
struct node *next; //指针域
}Node,*link; //Node为node类型的别名,link为node类型的指针别名
4.函数接口代码.
1.定义提示菜单
//定义提示菜单
void myMenu(){
printf("*****************************菜单*****************************n");
printf("***********************1 增加学生记录*************************n");
printf("***********************2 删除学生记录*************************n");
printf("***********************3 查找学生记录*************************n");
printf("***********************4 修改学生记录*************************n");
printf("***********************5 统计学生人数 ************************n");
printf("***********************6 显示学生记录*************************n");
printf("***********************7 退出系统 ****************************n");
}
2.增加学生记录
void inputStudent(link l){
printf("请输入学生学号:");
scanf("%s",l->data.studentNo);
printf("请输入学生的姓名:");
scanf("%s",l->data.studentName);
printf("请输入学生的成绩:");
scanf("%s",&(l->data.score));
//每个新创建的节点的next域都初始化为NULL
l->next = NULL;
system("cls");
}
3.输入学号接口·
void inputStudentNo(char s[],char no[]){
printf("请输入要%s的学生学号:",s);
scanf("%s",no);
}
4.遍历表中学生
//遍历表中学生
void displayNode(link head){
if(head==NULL)
{
printf("学生为空n");
return;
}
else
{
link p=head->next;
while(p)
{
cout<<"姓名:"<data.studentName<<" 学号"<data.studentNo<<" 成绩:"<data.score<next;
}
}
// 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息
system("pause");
system("cls");
}
5.增加学生记录
bool addNode(link head){
link p,q; //p,q两个节点一前一后
link node; //node指针指向新创建的节点
node=(link)malloc(sizeof(Node));
inputStudent(node);
q = head;
p = head->next; //q指向head后面的第一个有效节点
if(head->next==NULL)
//链表为空时
head->next = node;
else {
//循环访问链表中的所有节点
while(p != NULL){
if (node->data.studentNo < p->data.studentNo){
//如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序
q->next = node;
node->next = p;
return true;
}
else{
//如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后)
q = p;
p = p->next;
}
}
//如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面
q->next = node;
}
return true;
system("pause");
system("cls");
}
6.删除学生信息
//删除学生信息
bool deleteNode(link head){
// 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回false
//输入要处理的学号
char no[NO_LENGTH];
inputStudentNo("删除",no);
link p=head->next;
link q=head;
while(p)
{
if(strcmp(p->data.studentNo,no)==0)
{
q->next=p->next;
free(p);
system("pause");
system("cls");
return true;
}
else
{
q=p;
p=p->next;
}
}
system("pause");
system("cls");
return false;
}
7.查找学生信息
//查找学生信息
bool queryNode(link head){
// 按照给定的学号查询学生记录,如果查找成功返回true,如果没找到学号返回false
//输入要处理的学号
char no[NO_LENGTH];
inputStudentNo("查找",no);
link p=head->next;
while(p)
{
if(strcmp(p->data.studentNo,no)==0)
{
system("cls");
cout<<"姓名:"<data.studentName<<" 学号"<data.studentNo<<" 成绩:"<data.score<next;
}
}
system("cls");
return false;
}
8.修改学生信息
//修改学生信息
bool modifyNode(link head){
// 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false
//输入要处理的学号
char no[NO_LENGTH];
inputStudentNo("修改",no);
link p=head->next;
while(p)
{
if(strcmp(p->data.studentNo,no)==0)
{
cout<<"请输入修改后的姓名"<>p->data.studentName;
cout<<"请输入修改后的学号"<>p->data.studentNo;
cout<<"请输入修改后的成绩"<>p->data.score;
system("cls");
return true;
}
else
{
p=p->next;
}
}
system("cls");
return false;
}
9.统计学生人数
//统计学生人数
int countNode(link head){
//统计学生人数,扫描链表统计节点个数,返回节点数
link p;
int count = 0;
p = head->next;
while(p)
{
p=p->next;
count++;
}
//填充代码
system("cls");
return count;
}
10.清空链表
//清空链表
void clearlink(link head){
link q,p;
p=head->next;
q=head;
while(p)
{
q->next=p->next;
free(p);
p=q->next;
}
//遍历链表,用free语句删除链表中用malloc建立起的所有的节点
}
5.main函数
int main() {
int select;
int count;
link head; // 定义链表
//建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据
head = (link)malloc(sizeof(Node));
head->next = NULL;
while(1)
{
myMenu();
printf("n请输入你的选择(0-7):"); //显示提示信息
scanf("%d",&select);
switch(select)
{
case 1:
//增加学生记录
if(addNode(head))
printf("成功插入一个学生记录。nn");
break;
case 2:
//删除学生记录
if(deleteNode(head))
printf("成功删除一个学生记录。nn");
else
printf("没有找到要删除的学生节点。nn");
break;
case 3:
//查询学生记录
if(queryNode(head))
printf("成功找到学生记录。nn");
else
printf("没有找到要查询的学生节点。nn");
break;
case 4:
//修改学生记录
if(modifyNode(head))
printf("成功修改一个学生记录。nn");
else
printf("没有找到要修改的学生节点。nn");
break;
case 5:
//统计学生人数
count = countNode(head);
printf("学生人数为:%dnn",count);
break;
case 6:
//显示学生记录
displayNode(head);
break;
case 7:
//退出前清除链表中的所有结点
clearlink(head);
return 0;
default:
printf("输入不正确,应该输入0-7之间的数。nn");
system("cls");
break;
}
}
return 0;
}
6.总源码(可直接复制运行)
#include7.测试结果#include #include #include #include #include using namespace std; #define NO_LENGTH 20 #define NAME_LENGTH 11 typedef struct Student{ char studentNo[NO_LENGTH]; char studentName[NAME_LENGTH]; int score; }st; typedef struct node { struct Student data; //数据域 struct node *next; //指针域 }Node,*link; //Node为node类型的别名,link为node类型的指针别名 //定义提示菜单 void myMenu(){ printf("*****************************菜单*****************************n"); printf("***********************1 增加学生记录*************************n"); printf("***********************2 删除学生记录*************************n"); printf("***********************3 查找学生记录*************************n"); printf("***********************4 修改学生记录*************************n"); printf("***********************5 统计学生人数 ************************n"); printf("***********************6 显示学生记录*************************n"); printf("***********************7 退出系统 ****************************n"); } void inputStudent(link l){ printf("请输入学生学号:"); scanf("%s",l->data.studentNo); printf("请输入学生的姓名:"); scanf("%s",l->data.studentName); printf("请输入学生的成绩:"); scanf("%d",&(l->data.score)); //每个新创建的节点的next域都初始化为NULL l->next = NULL; system("cls"); } void inputStudentNo(char s[],char no[]){ printf("请输入要%s的学生学号:",s); scanf("%s",no); } //遍历表中学生 void displayNode(link head){ if(head==NULL) { printf("学生为空n"); return; } else { link p=head->next; while(p) { cout<<"姓名:"< data.studentName<<" 学号"< data.studentNo<<" 成绩:"< data.score< next; } } // 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息 system("pause"); system("cls"); } bool addNode(link head){ link p,q; //p,q两个节点一前一后 link node; //node指针指向新创建的节点 node=(link)malloc(sizeof(Node)); inputStudent(node); q = head; p = head->next; //q指向head后面的第一个有效节点 if(head->next==NULL) //链表为空时 head->next = node; else { //循环访问链表中的所有节点 while(p != NULL){ if (node->data.studentNo < p->data.studentNo){ //如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序 q->next = node; node->next = p; return true; } else{ //如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后) q = p; p = p->next; } } //如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面 q->next = node; } return true; system("pause"); system("cls"); } bool deleteNode(link head){ // 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回false //输入要处理的学号 char no[NO_LENGTH]; inputStudentNo("删除",no); link p=head->next; link q=head; while(p) { if(strcmp(p->data.studentNo,no)==0) { q->next=p->next; free(p); system("pause"); system("cls"); return true; } else { q=p; p=p->next; } } system("pause"); system("cls"); return false; } //查找学生信息 bool queryNode(link head){ // 按照给定的学号查询学生记录,如果查找成功返回true,如果没找到学号返回false //输入要处理的学号 char no[NO_LENGTH]; inputStudentNo("查找",no); link p=head->next; while(p) { if(strcmp(p->data.studentNo,no)==0) { system("cls"); cout<<"姓名:"< data.studentName<<" 学号"< data.studentNo<<" 成绩:"< data.score< next; } } system("cls"); return false; } //修改学生信息 bool modifyNode(link head){ // 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false //输入要处理的学号 char no[NO_LENGTH]; inputStudentNo("修改",no); link p=head->next; while(p) { if(strcmp(p->data.studentNo,no)==0) { cout<<"请输入修改后的姓名"< >p->data.studentName; cout<<"请输入修改后的学号"< >p->data.studentNo; cout<<"请输入修改后的成绩"< >p->data.score; system("cls"); return true; } else { p=p->next; } } system("cls"); return false; } //统计学生人数 int countNode(link head){ //统计学生人数,扫描链表统计节点个数,返回节点数 link p; int count = 0; p = head->next; while(p) { p=p->next; count++; } //填充代码 system("cls"); return count; } //清空链表 void clearlink(link head){ link q,p; p=head->next; q=head; while(p) { q->next=p->next; free(p); p=q->next; } //遍历链表,用free语句删除链表中用malloc建立起的所有的节点 } int main() { int select; int count; link head; // 定义链表 //建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据 head = (link)malloc(sizeof(Node)); head->next = NULL; while(1) { myMenu(); printf("n请输入你的选择(0-7):"); //显示提示信息 scanf("%d",&select); switch(select) { case 1: //增加学生记录 if(addNode(head)) printf("成功插入一个学生记录。nn"); break; case 2: //删除学生记录 if(deleteNode(head)) printf("成功删除一个学生记录。nn"); else printf("没有找到要删除的学生节点。nn"); break; case 3: //查询学生记录 if(queryNode(head)) printf("成功找到学生记录。nn"); else printf("没有找到要查询的学生节点。nn"); break; case 4: //修改学生记录 if(modifyNode(head)) printf("成功修改一个学生记录。nn"); else printf("没有找到要修改的学生节点。nn"); break; case 5: //统计学生人数 count = countNode(head); printf("学生人数为:%dnn",count); break; case 6: //显示学生记录 displayNode(head); break; case 7: //退出前清除链表中的所有结点 clearlink(head); return 0; default: printf("输入不正确,应该输入0-7之间的数。nn"); system("cls"); break; } } return 0; }



