📄 sy1.cpp
字号:
// sy1.cpp : Defines the entry point for the console application.
//
//#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "iostream.h"
#include "string.h"
#include "iomanip.h"
#define NULL 0
typedef struct student //定义Student型结构体
{
char name[20]; //姓名
char no[10]; //学号
int score; //成绩
struct student *next; //指向Student类型的指针
}Student;
void option() //选择界面函数
{
printf("\n\t\t\t 欢迎使用!");
printf("\n\t\t-------------------------------------");
printf("\n\t\t******** 功 能 列 表 ********");
printf("\n\t\t** 1:根据学生姓名进行查找 **");
printf("\n\t\t** 2:根据指定位置进行查找 **");
printf("\n\t\t** 3:添加新的学生信息 **");
printf("\n\t\t** 4:删除指定位置的学生记录 **");
printf("\n\t\t** 5:统计链表中学生人数 **");
printf("\n\t\t** 0 :退出系统 **");
printf("\n\t\t*************************************");
printf("\n\t\t-------------------------------------");
printf("\n\t\t******系统设计:信息05-1班:雷震宇***");
printf("\n\t\t-------------------------------------");
printf("\n\t\t请输入功能号码:");
}
void initialize(Student **L) //初始化单链表
{
*L=new Student; //建立由头指针L指示的头结点
(*L)->next=NULL; //头结点的指针域指向NULL(空)
}
void build(Student *p,char *x,char *y,int z) //建立一个结点,并将其插入头接点之后(前插法)
{
Student *s;
s=new Student; //申请一个空结点由s指示
strcpy(s->name,x); //给结点s的数据域赋值
strcpy(s->no,y);
s->score=z;
s->next=p->next;
p->next=s; //完成结点插入
}
void travel(Student *p) //遍历单链表,并输出全部的结点
{
int j=0; //计数器
Student *s;
s=p->next; //让s指向首元结点
cout<<"此时整个链表中的信息如下"<<endl;
while(s!=NULL) //s不为空时循环
{
++j;
cout<<"位于链表位置"<<setw(2)<<j<<"处的学生信息如下:"<<endl;
cout<<"姓名:"<<setw(6)<<s->name<<"学号:"<<setw(4)<<s->no<<"成绩:"<<setw(4)<<s->score<<endl<<endl;
s=s->next; //让s指向下一个结点
}
}
void count(Student *p) //计算单链表中结点个数的函数
{
Student *s;
int j=0; //计数器
s=p->next; //让s指向首元结点
while(s!=NULL)
{
s=s->next; //让s指向下一个结点
++j;
}
cout<<"链表中共有"<<setw(2)<<j<<"个学生!"<<endl<<endl;
}
void search_with_name(Student *p) //根据姓名查找
{
char name[20];
cout<<"请输入你想查找的同学的名字:";
cin>>name;
Student *s;
s=p->next; //让s指向首元结点
while(s!=NULL)
{
if(!strcmp(s->name,name)) //查找姓名为name的结点
{
cout<<"学生"<<setw(6)<<name<<"信息如下:"<<endl<<endl;
cout<<"姓名:"<<setw(6)<<s->name<<"学号:"<<setw(4)<<s->no<<"成绩:"<<setw(4)<<s->score<<endl<<endl;
break; //找到指定姓名结点后跳出循环
}
s=s->next; //让s指向下一个结点
}
if(s==NULL) //输入的姓名不存在时
{
cout<<"无此人!"<<endl<<endl;
}
}
void search_with_position(Student *p) //根据位置查找
{
int i;
int j=0; //计数器
Student *s;
cout<<"请输入想要查找的位置:";
cin>>i;
s=p->next; //让s指向首元结点
while(s!=NULL)
{
++j;
if(j==i) //查找位置为i的结点
{
cout<<"位置"<<setw(2)<<i<<"处的学生信息如下:"<<endl<<endl;
cout<<"姓名:"<<setw(6)<<s->name<<"学号:"<<setw(4)<<s->no<<"成绩:"<<setw(4)<<s->score<<endl<<endl;
break; //找到指定位置结点后跳出循环
}
s=s->next; //让s指向下一个结点
}
if(s==NULL) //输入的位置不存在时
{
cout<<"输入的位置有错误!"<<endl<<endl;
}
}
Student *search(Student *p,int x) //在单链表中寻找位置为x的结点
{
Student *s;
s=p->next; //让s指向首元结点
int j=0; //计数器
while(s!=NULL)
{
++j;
if(j==x)
{
return(s); //找到结点后返回该结点的指针
}
s=s->next; //让s指向下一个结点
}
return(NULL);
}
void insert(Student *p) //在位置为i的结点后插入新的结点
{
int i;
cout<<"您想在位置几之后插入新的学生信息?其输入位置:";
cin>>i;
Student *n;
n=new Student; //申请一个空结点由s指示
cout<<"请输入插入学生的姓名:";
cin>>n->name;
cout<<endl;
cout<<"请输入插入学生的学号:";
cin>>n->no;
cout<<endl;
cout<<"请输入插入学生的成绩:";
cin>>n->score;
cout<<endl;
Student *m;
m=search(p,i); //调用search函数,查找位置为i的结点,得到该结点的指针m
if(m!=NULL)
{
n->next=m->next;
m->next=n; //完成结点插入
cout<<"插入成功!"<<endl<<endl;
}
else //输入的位置不存在时
{
cout<<"输入的位置有错误!"<<endl<<endl;
}
}
void del(Student *p) //删除位置为i的结点
{
int i;
int j=0; //计数器
cout<<"您想删除哪个位置的学生信息?请输入位置:";
cin>>i;
Student *s,*q;
q=p; //让q指向头结点
s=p->next; //让s指向首元结点
while(s!=NULL)
{
++j;
if(j!=i)
{
q=s; //位置不为i时,q指向下一个结点
s=s->next; //s指向下一个结点;
}
else
{
q->next=s->next; //找到位置为i的结点后删除
delete s;
cout<<"删除成功!"<<endl<<endl;
break; //删除成功跳出循环
}
}
if(s==NULL) //输入的位置不存在时
{
cout<<"输入的位置有错误!"<<endl<<endl;
}
}
int main(int argc, char* argv[])
{
int n,i,choice;
cout<<"输入你想建立的链表长度(既链表中的学生个数):";
cin>>n;
Student *L; //建立头指针
initialize(&L); //初始化单链表
char name[10],no[10];
int score;
for(i=0;i<n;i++) //建立单链表
{
cout<<setw(2)<<"请输入第"<<setw(2)<<i+1<<"个同学的信息,他/她将出现在链表位置"<<setw(2)<<n-i<<"处"<<endl;
cout<<endl<<"请输入位置"<<setw(2)<<n-i<<"处同学的姓名:";
cin>>name;
cout<<endl<<"请输入位置"<<setw(2)<<n-i<<"处同学的学号:";
cin>>no;
cout<<endl<<"请输入位置"<<setw(2)<<n-i<<"处同学的成绩:";
cin>>score;
build(L,name,no,score); //在头结点后插入
cout<<endl<<"您录入的第"<<setw(2)<<i+1<<"个同学,位于链表位置"<<setw(2)<<n-i<<"处,其信息为:"<<endl;
cout<<"姓名为:"<<setw(2)<<name<<"学号为:"<<setw(2)<<no<<"成绩为:"<<setw(2)<<score<<endl<<endl<<endl;
}
travel(L); //输出建立的单链表
do{
option();
cin>>choice;
switch(choice)
{
case 1:
search_with_name(L);
break;
case 2:
search_with_position(L);
break;
case 3:
insert(L);
travel(L); //输出插入新结点后的单链表
break;
case 4:
del(L);
travel(L); //输出删除结点后的单链表
break;
case 5:
count(L);
break;
case 0:
cout<<endl<<setw(30)<<"谢谢使用!"<<endl;
exit(0);
break;
default:
cout<<"输入错误!"<<endl<<"请确认后重新输入!"<<endl;
}
}while(choice!=0);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -