【數據結構】 之 單鏈表(含實例)

筆者現大三,這篇博文及後面的幾篇博文都是對大二所做的題目一些總結,哈哈,感覺自己那時候學的還可以,希望自己這點筆記能對你們有點幫助吧,加油!!!其實數據結構也沒傳說中的那麼難,並且以後在我們面試的時候,數據結構可是面試官的法寶,對吧,咱們不能輸在起跑線線上,好了,廢話不多說,現在讓我們來學習最簡單鏈表——單鏈表。我先把老師給我們出的題目給大家看看吧,不知道我們是不是一樣的(純潔的微笑),題目如下:
設計一個包含學生基本信息(學號,姓名,成績)的單鏈表,編程完成如下功能:
⑴ 初始化單鏈表 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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章