笔者现大三,这篇博文及后面的几篇博文都是对大二所做的题目一些总结,哈哈,感觉自己那时候学的还可以,希望自己这点笔记能对你们有点帮助吧,加油!!!其实数据结构也没传说中的那么难,并且以后在我们面试的时候,数据结构可是面试官的法宝,对吧,咱们不能输在起跑线线上,好了,废话不多说,现在让我们来学习最简单链表——单链表。我先把老师给我们出的题目给大家看看吧,不知道我们是不是一样的(纯洁的微笑),题目如下:
设计一个包含学生基本信息(学号,姓名,成绩)的单链表,编程完成如下功能:
⑴ 初始化单链表 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 文件中( 可以任意重复测试) 。
设计一个包含学生基本信息(学号,姓名,成绩)的单链表,编程完成如下功能:
⑴ 初始化单链表 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