設計一個包含學生基本信息(學號,姓名,成績)的單鏈表,編程完成如下功能:
⑴ 初始化單鏈表 L: 根據用戶指定的學生數, 採用尾插法插入學生結點;
⑵ 打印表中所有學生信息: 逐個顯示錶中所有學生的基本信息;
⑶ 判斷 L 是否爲空表;
⑷ 查找指定的學生: 根據姓名進行查找, 輸出此學生的學號和成績;
⑸ 根據指定的位置, 返回並輸出相應學生的基本信息;
⑹ 給定一個學生信息, 將其插入到表中指定的位置;
⑺ 刪除指定位置的學生記錄;
⑻ 統計表中學生個數(求表長度);
⑼ 銷燬表 L;
以上爲必做題, 下面爲附加題(選做) 。
⑽ 建立兩個有序(學號) 的學生單鏈表 La 和 Lb: 分別向 La 和 Lb 逐個輸入 m 個和 n 個
學生的信息(並不一定按學號大小順序輸入);
⑾ 打印表 La 和 Lb 中的學生信息;
⑿ 將 La 和 Lb 歸併爲新的有序表 Lc;
⒀ 打印表 Lc 中的學生信息;
⒁ 銷燬表 La、 Lb 和 Lc。
其他要求:
⑴ 將所需要的標準頭文件以及一些符號常量的定義等放在 Common.h 頭文件中;
⑵ 單鏈表類型定義和基本操作函數聲明放在 Linklist.h 頭文件中;
⑶ 基本操作函數的實現放在 Linklist.cpp 文件中;
⑷ 測試應用程序放在 LinkListTestApp.cpp 文件中( 可以任意重複測試) 。
好了,知道題目,就開始咱們敲代碼的生活了,Are You Ready?對了,你們用什麼編譯器,用古董的VC,還是DEVC++,VC呢,是老師讓我們用的,一般用來寫作業。而我喜歡DEV(參加競賽的時候也用它哦,比如藍橋杯),先把它們倆的下載地址給你們。
VC下載:點此下載(可能裝VC的時候有點問題,點擊這裏查看解決方法)
DEVC++下載:點此下載
工程圖:
1.先建個工程,然後寫好名爲LinkList.h頭文件
#include<iostream>
#include<string.h>
using namespace std;
typedef struct ElemType
{
int number;
char name[20];
double score;
}ElemType;
typedef struct Node //鉤造鏈表結構體
{
ElemType data; //數據域
struct Node *next; //指針域
}LNode,*LinkList;
void print(); //打印目錄函數
void CreatList(LinkList &L); //創建鏈表L
void CreatList(LinkList La,LinkList Lb,LinkList &Lc);//歸併La、Lb,創建Lc
void DispList(LinkList &L); //輸出鏈表
void Panduan(LinkList L); //判斷鏈表L是否爲空
void LocateList(LinkList L,ElemType e); //通過學生姓名查找學生信息
void LockList(LinkList L,int i); //通過位置查找學生信息
void Charu(LinkList &L,ElemType e,int i); //將一位學生的信息插入表中指定位置
void DeleteList(LinkList &L,int i); //刪除指定位置的學生信息
void LengthList(LinkList L); //求鏈表L中學生的個數
void DestoryList(LinkList &L); //銷燬鏈表L
2.寫對鏈表操作(LinkList.cpp)
#include"Linklist.h"
void print() //打印目錄函數
{
printf("************************************\n");
printf("* 0.輸出選項 *\n");
printf("* 1.請按順序輸入n個學生的信息 *\n");
printf("* 2.顯示所有學生的信息 *\n");
printf("* 3.判斷該表是否爲空表 *\n");
printf("* 4.輸入學生姓名,查找該學生的信息*\n");
printf("* 5.輸入位置,顯示該學生信息 *\n");
printf("* 6.添加學生信息 *\n");
printf("* 7.刪除學生信息 *\n");
printf("* 8.計算學生個數 *\n");
printf("* 9.銷燬表 *\n");
printf("* 10.分別輸入學生表La和Lb *\n");
printf("* 11.分別輸出學生表La和Lb的信息 *\n");
printf("* 12.將La和Lb歸併有序表Lc *\n");
printf("* 13.輸出Lc的信息 *\n");
printf("* 14.銷燬La,Lb,Lc *\n");
printf("* 其他:輸出選項 *\n");
printf("************************************\n");
}
void CreatList(LinkList &L) //創建鏈表L
{
int i,n,temp;
char str[20];
double temp2;
printf("請輸入錄入學生的個數:");
scanf("%d",&n);
L=new LNode;
LinkList r,p,q;
L->next=NULL;
r=L;
for(i=0;i<n;i++)
{
p=new LNode;
printf("學號:");
scanf("%d",&p->data.number);
printf("姓名:");
scanf("%s",&p->data.name);
printf("分數:");
scanf("%lf",&p->data.score);
p->next=NULL;
r->next=p;
r=p;
printf("\n");
}
p=L->next; //鏈表排序
while(p)
{
q=p;
q=q->next;
while(q)
{
if(p->data.number > q->data.number)
{
temp=p->data.number;
p->data.number=q->data.number;
q->data.number=temp;
strcpy(str,p->data.name);
strcpy(p->data.name,q->data.name);
strcpy(q->data.name,str);
temp2=p->data.score;
p->data.score=q->data.score;
q->data.score=temp2;
}
q=q->next;
}
p=p->next;
}
printf("完成錄入!\n");
}
void CreatList(LinkList La,LinkList Lb,LinkList &Lc)//歸併La、Lb,創建Lc
{
LinkList pc,pa,pb;
pa=La->next;
pb=Lb->next;
Lc=La;
pc=Lc;
while(pa && pb)
{
if(pa->data.number <= pb->data.number)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pa=pb->next;
}
}
pc->next=pa?pa:pb;
delete Lb;
printf("歸併完成!\n");
}
void DispList(LinkList &L) //輸出鏈表
{
LinkList p;
p=L->next;
if(!p)
{
printf("鏈表爲空!\n");
}
else
{
while(p)
{
printf("學號:%d ",p->data.number);
printf("姓名:%s ",p->data.name);
printf("分數:%.3f",p->data.score);
p=p->next;
printf("\n");
}
}
}
void Panduan(LinkList L) //判斷鏈表L是否爲空
{
LinkList p;
p=L->next;
if(!p)
{
printf("鏈表爲空!\n");
}
else
{
printf("鏈表有值!\n");
}
}
void LocateList(LinkList L,ElemType e) //通過學生姓名查找學生信息
{
LinkList p;
p=L->next;
if(!p)
{
printf("鏈表爲空!\n");
}
else
{
while(p)
{
if(strcmp(p->data.name,e.name)==0)
{
printf("該同學姓名:%d ",p->data.number);
printf("分數:%.3f",p->data.score);
break;
}
p=p->next;
}
if(p==NULL) printf("未查找到!\n");
printf("\n");
}
}
void LockList(LinkList L,int i) //通過位置查找學生信息
{
LinkList p;
p=L->next;
int j=0;
if(!p)
{
printf("鏈表爲空!\n");
}
else
{
while(p && j<i-1)
{
p=p->next;
j++;
}
if(p==NULL || j>i)
{
printf("未查找到!");
return;
}
printf("學號:%d ",p->data.number);
printf("姓名:%s ",p->data.name);
printf("分數:%.3f",p->data.score);
printf("\n");
}
}
void Charu(LinkList &L,ElemType e,int i) //將一位學生的信息插入表中指定位置
{
LinkList p,q;
p=L->next;
int j=0;
if(!p)
{
printf("鏈表爲空!\n");
}
else
{
while(p && j<i-2)
{
p=p->next;
j++;
}
q=new LNode;
q->data.number=e.number;
strcpy(q->data.name,e.name);
q->data.score=e.score;
q->next=p->next;
p->next=q;
printf("插入成功!\n");
}
}
void DeleteList(LinkList &L,int i) //刪除指定位置的學生信息
{
LinkList p;
p=L;
int j=0;
if(!p)
{
printf("鏈表爲空!\n");
}
else
{
while(p->next && j<i-1)
{
p=p->next;
j++;
}
p->next=p->next->next;
printf("刪除成功!\n");
}
}
void LengthList(LinkList L) //求鏈表L中學生的個數
{
LinkList p;
p=L->next;
int j=0;
if(!p)
{
printf("鏈表爲空!\n");
}
else
{
while(p)
{
j++;
p=p->next;
}
printf("學生的個數:%d\n",j);
}
}
void DestoryList(LinkList &L) //銷燬鏈表L
{
LinkList p,q;
p=L;
while(p)
{
q=p;
p=p->next;
delete q;
}
printf("銷燬成功!\n");
}
3.寫main函數(LinkListTestApp1.cpp)
#include"common.h"
#include"Linklist.h"
int main()
{
int i,j,op;
char str[20];
ElemType e;
LinkList L,La,Lb,Lc;
print();
while(1)
{
scanf("%d",&op);
switch(op)
{
case 0:
print();
break;
case 1:
CreatList(L);
break;
case 2:
DispList(L);
break;
case 3:
Panduan(L);
break;
case 4:
printf("請輸入要查找的學生姓名:");
scanf("%s",&e.name);
LocateList(L,e);
break;
case 5:printf("請輸入所指定的位置:");
scanf("%d",&i);
LockList(L,i);
break;
case 6:
printf("請輸入該同學學號:");
scanf("%d",&e.number);
printf("請輸入該同學姓名:");
scanf("%s",&e.name);
printf("請輸入該同學分數:");
scanf("%lf",&e.score);
printf("請輸入插入位置:");
scanf("%d",&i);
Charu(L,e,i);
break;
case 7:printf("請輸入所需刪除同學的位置:");
scanf("%d",&i);
DeleteList(L,i);
break;
case 8:
LengthList(L);
break;
case 9:
DestoryList(L);
break;
case 10:
printf("La:\n");
CreatList(La);
printf("Lb:\n");
CreatList(Lb);
break;
case 11:
printf("La:\n");
DispList(La);
printf("Lb:\n");
DispList(Lb);
break;
case 12:
CreatList(La,Lb,Lc);
break;
case 13:
printf("Lc:\n");
DispList(Lc);
break;
case 14:
DestoryList(La);
DestoryList(Lb);
DestoryList(Lc);
break;
default:print();break;
}
}
return 0;
}
運行截圖:
好了,就是這麼單鏈表就講到這了,有需要源碼的,下載網址:
http://pan.baidu.com/s/1dFNu4rn