?? 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型結(jié)構(gòu)體
{
char name[20]; //姓名
char no[10]; //學號
int score; //成績
struct student *next; //指向Student類型的指針
}Student;
void option() //選擇界面函數(shù)
{
printf("\n\t\t\t 歡迎使用!");
printf("\n\t\t-------------------------------------");
printf("\n\t\t******** 功 能 列 表 ********");
printf("\n\t\t** 1:根據(jù)學生姓名進行查找 **");
printf("\n\t\t** 2:根據(jù)指定位置進行查找 **");
printf("\n\t\t** 3:添加新的學生信息 **");
printf("\n\t\t** 4:刪除指定位置的學生記錄 **");
printf("\n\t\t** 5:統(tǒng)計鏈表中學生人數(shù) **");
printf("\n\t\t** 0 :退出系統(tǒng) **");
printf("\n\t\t*************************************");
printf("\n\t\t-------------------------------------");
printf("\n\t\t******系統(tǒng)設(shè)計:信息05-1班:雷震宇***");
printf("\n\t\t-------------------------------------");
printf("\n\t\t請輸入功能號碼:");
}
void initialize(Student **L) //初始化單鏈表
{
*L=new Student; //建立由頭指針L指示的頭結(jié)點
(*L)->next=NULL; //頭結(jié)點的指針域指向NULL(空)
}
void build(Student *p,char *x,char *y,int z) //建立一個結(jié)點,并將其插入頭接點之后(前插法)
{
Student *s;
s=new Student; //申請一個空結(jié)點由s指示
strcpy(s->name,x); //給結(jié)點s的數(shù)據(jù)域賦值
strcpy(s->no,y);
s->score=z;
s->next=p->next;
p->next=s; //完成結(jié)點插入
}
void travel(Student *p) //遍歷單鏈表,并輸出全部的結(jié)點
{
int j=0; //計數(shù)器
Student *s;
s=p->next; //讓s指向首元結(jié)點
cout<<"此時整個鏈表中的信息如下"<<endl;
while(s!=NULL) //s不為空時循環(huán)
{
++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指向下一個結(jié)點
}
}
void count(Student *p) //計算單鏈表中結(jié)點個數(shù)的函數(shù)
{
Student *s;
int j=0; //計數(shù)器
s=p->next; //讓s指向首元結(jié)點
while(s!=NULL)
{
s=s->next; //讓s指向下一個結(jié)點
++j;
}
cout<<"鏈表中共有"<<setw(2)<<j<<"個學生!"<<endl<<endl;
}
void search_with_name(Student *p) //根據(jù)姓名查找
{
char name[20];
cout<<"請輸入你想查找的同學的名字:";
cin>>name;
Student *s;
s=p->next; //讓s指向首元結(jié)點
while(s!=NULL)
{
if(!strcmp(s->name,name)) //查找姓名為name的結(jié)點
{
cout<<"學生"<<setw(6)<<name<<"信息如下:"<<endl<<endl;
cout<<"姓名:"<<setw(6)<<s->name<<"學號:"<<setw(4)<<s->no<<"成績:"<<setw(4)<<s->score<<endl<<endl;
break; //找到指定姓名結(jié)點后跳出循環(huán)
}
s=s->next; //讓s指向下一個結(jié)點
}
if(s==NULL) //輸入的姓名不存在時
{
cout<<"無此人!"<<endl<<endl;
}
}
void search_with_position(Student *p) //根據(jù)位置查找
{
int i;
int j=0; //計數(shù)器
Student *s;
cout<<"請輸入想要查找的位置:";
cin>>i;
s=p->next; //讓s指向首元結(jié)點
while(s!=NULL)
{
++j;
if(j==i) //查找位置為i的結(jié)點
{
cout<<"位置"<<setw(2)<<i<<"處的學生信息如下:"<<endl<<endl;
cout<<"姓名:"<<setw(6)<<s->name<<"學號:"<<setw(4)<<s->no<<"成績:"<<setw(4)<<s->score<<endl<<endl;
break; //找到指定位置結(jié)點后跳出循環(huán)
}
s=s->next; //讓s指向下一個結(jié)點
}
if(s==NULL) //輸入的位置不存在時
{
cout<<"輸入的位置有錯誤!"<<endl<<endl;
}
}
Student *search(Student *p,int x) //在單鏈表中尋找位置為x的結(jié)點
{
Student *s;
s=p->next; //讓s指向首元結(jié)點
int j=0; //計數(shù)器
while(s!=NULL)
{
++j;
if(j==x)
{
return(s); //找到結(jié)點后返回該結(jié)點的指針
}
s=s->next; //讓s指向下一個結(jié)點
}
return(NULL);
}
void insert(Student *p) //在位置為i的結(jié)點后插入新的結(jié)點
{
int i;
cout<<"您想在位置幾之后插入新的學生信息?其輸入位置:";
cin>>i;
Student *n;
n=new Student; //申請一個空結(jié)點由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); //調(diào)用search函數(shù),查找位置為i的結(jié)點,得到該結(jié)點的指針m
if(m!=NULL)
{
n->next=m->next;
m->next=n; //完成結(jié)點插入
cout<<"插入成功!"<<endl<<endl;
}
else //輸入的位置不存在時
{
cout<<"輸入的位置有錯誤!"<<endl<<endl;
}
}
void del(Student *p) //刪除位置為i的結(jié)點
{
int i;
int j=0; //計數(shù)器
cout<<"您想刪除哪個位置的學生信息?請輸入位置:";
cin>>i;
Student *s,*q;
q=p; //讓q指向頭結(jié)點
s=p->next; //讓s指向首元結(jié)點
while(s!=NULL)
{
++j;
if(j!=i)
{
q=s; //位置不為i時,q指向下一個結(jié)點
s=s->next; //s指向下一個結(jié)點;
}
else
{
q->next=s->next; //找到位置為i的結(jié)點后刪除
delete s;
cout<<"刪除成功!"<<endl<<endl;
break; //刪除成功跳出循環(huán)
}
}
if(s==NULL) //輸入的位置不存在時
{
cout<<"輸入的位置有錯誤!"<<endl<<endl;
}
}
int main(int argc, char* argv[])
{
int n,i,choice;
cout<<"輸入你想建立的鏈表長度(既鏈表中的學生個數(shù)):";
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<<"個同學的信息,他/她將出現(xiàn)在鏈表位置"<<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); //在頭結(jié)點后插入
cout<<endl<<"您錄入的第"<<setw(2)<<i+1<<"個同學,位于鏈表位置"<<setw(2)<<n-i<<"處,其信息為:"<<endl;
cout<<"姓名為:"<<setw(2)<<name<<"學號為:"<<setw(2)<<no<<"成績?yōu)?"<<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); //輸出插入新結(jié)點后的單鏈表
break;
case 4:
del(L);
travel(L); //輸出刪除結(jié)點后的單鏈表
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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -