⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sy1.cpp

📁 数据结构 线性表的基本操作 如建立、查找、插入和删除等 建立一个包含学生(学号
💻 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 + -