【数据结构】 之 单链表(含实例)

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


  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值