`
xitong
  • 浏览: 6202802 次
文章分类
社区版块
存档分类
最新评论

单链表及其基本方法的实现

 
阅读更多

单链表及其基本方法的实现


定义:线性表的链式存储结构使用一组任意的存储单元(可以连续,也可以不连续)存储线性表的数据元素。每个结点包含两个域:指针域(用来存储直接后继的存储位置)和数据域(用来存储数据元素信息)。
特点:由于链表不要求逻辑上相邻的元素在物理位置上也相邻,因此它没有顺序表随机存取的优点,每个元素的在内存中的位置是包含在该元素的直接前趋的指针域中。但是,链式存储结构在插入和删除元素上效率非常高,不需要元素移动的代价。

//单链表的实现和基本方法

#include<iostream>
#include<iomanip>
#include<stdlib.h>
#include<string.h>
using namespace std;

//结点结构
typedef int ElemType;
typedef struct LNode{
	ElemType data;				//数据域
	struct LNode *next;		//指针域
}LNode, *LinkList;

//逆序建立单链表
void CreateList(LinkList &L, int n){
	L = (LinkList) malloc(sizeof(LNode));	//头结点
	L->data = 0;
	L->next = NULL;
	LinkList p;
	for(int i=n; i>0; --i){
		p = (LinkList) malloc(sizeof(LNode));
		p->next = L->next;
		L->next = p;
		p->data = i;
	}
}

//销毁链表
void DestroyList(LinkList &L){
	LinkList p = L->next, q;
	while(p){
		q = p;
		p = p->next;
		free(q);
	}
	free(L);
	L = NULL;
}

//遍历链表
void TraverseList(LinkList &L){
	LinkList p = L;
	while(p){
		cout<<setw(5)<<(p->data);
		p = p->next;
	}
	cout<<endl;
}

//访问第i个元素
bool GetElem(LinkList &L, int i, ElemType &e){
	LinkList p = L->next;	//p指向第一个元素
	int j = 1;
	while(p && j<i){
		p = p->next;
		++j;
	}
	if(!p||j>i)return false;	//元素不存在
	e = p->data;
	return true;
}

//在第i个位置前插入元素
bool ListInsert(LinkList &L, int i, ElemType e){
	LinkList p = L;
	int j = 0;
	while(p && j<i-1){
		p = p->next;
		++j;
	}
	if(!p||j>i-1)return false;
	LinkList s = (LinkList) malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}

//删除第i个元素
bool ListDelete(LinkList &L,int i, ElemType &e){
	LinkList p = L;
	int j = 0;
	while(p->next && j<i-1){
		p = p->next;
		++j;
	}
	if(!(p->next) || j>i-1)return false;
	e = p->next->data;
	p->next = p->next->next;
	return true;
}

//归并排序
void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc){
	LinkList pa = La->next;
	LinkList pb = Lb->next;
	LinkList pc = Lc = La;
	while(pa && pb){
		if(pa->data <= pb->data){
			pc->next = pa;
			pc = pa;
			pa = pa->next;
		}
		else{
			pc->next = pb;
			pc = pb;
			pb = pb->next;
		}
	}
	pc->next = pa? pa : pb;	//插入剩余段
	free(Lb);
}

//反转单链表
void ReverseList(LinkList &L){
	if(L==NULL || L->next==NULL)return;	//边界检测
	LinkList pNext = NULL;	//下一个结点
	LinkList pPrev = L;		//上一个节点
	LinkList pCur = L->next;//当前节点

       //遍历链表,将前节点设置为当前节点的下一结点
	while(pCur != NULL){
		pNext = pCur->next;
		pCur->next = pPrev;
		pPrev = pCur;
		pCur = pNext;
	}
	L->next = NULL;	//原来的头结点变成最后一个结点
	L = pPrev;		//重新设置头指针
}

int main(){
	//演示
	cout<<"建立链表"<<endl;
	LinkList L;
	CreateList(L, 10);
	TraverseList(L);

	cout<<"查找操作"<<endl;
	ElemType e;
	GetElem(L,4,e);
	cout<<e<<endl;

	cout<<"插入操作"<<endl;
	ListInsert(L,4,99);
	TraverseList(L);
	cout<<"删除操作"<<endl;
	ListDelete(L,4,e);
	TraverseList(L);

	cout<<"反转链表"<<endl;
	ReverseList(L);
	TraverseList(L);
	DestroyList(L);
	return 0;
}

结果:

建立链表
    0    1    2    3    4    5    6    7    8    9   10
查找操作
4
插入操作
    0    1    2    3   99    4    5    6    7    8    9   10
删除操作
    0    1    2    3    4    5    6    7    8    9   10
反转链表
   10    9    8    7    6    5    4    3    2    1    0



注意:上面的查找操作GetElem、插入操作ListInsert、删除操作ListDelete的时间复杂度均为O(n)。
这里,单链表的归并排序算法的时间复杂度和顺序表相同,但空间复杂度不同。在归并两个链表为一个链表时,不需要另外新建表的结点空间,只需要将原来两个链表中结点之间的关系解除,重新按元素值非递减的关系将所有结点链接成一个新表即可。

by chenqi / 20110914


分享到:
评论

相关推荐

    验证单链表及其上的基本操作并实现将单链表的链接完全颠倒

    用C++验证单链表及其上的基本操作并实现将单链表的链接完全颠倒

    验证单链表及其上的基本操作

    1、定义单链表类。 2、实验验证如下算法的正确性、各种功能及指标: 1)创建单链表; 2)插入操作:分别在当前结点后、表头、表尾插入值为x的结点; 3)删除操作:分别删除表头结点、表尾结点和当前结点的后继结点;...

    数据结构:不带头结点单链表的实现及其一些基本操作.cpp

    实现单链表及其一些基本操作函数(不带头结点) 1.头文件包含 2.宏定义及节点类型描述 3.初始化、判断是否为空 4.指定位置插入操作 5.在p节点后插入元素e 6.在p节点前插入元素e 7.删除操作:删除第i个节点,...

    数据结构-单链表-实验报告.rar_C++_tripk8z_单链表_单链表实验_实验报告

    (2)验证单链表及其基本操作的实现; (3)进一步理解算法与程序的关系,能够将单链表算法转换为对应的程序。 1.2 实验要求: (1)用头插法(或尾插法)建立带头结点的单链表; (2)对已建立的单链表实现插入、...

    单链表基本操作:建立链表,判空,求表长等

    实现单链表的基本操作:建立链表,判空,求表长等

    线性表的基本操作实现及其应用

    题目一、该程序的功能是实现单链表的定义和操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。其中,程序中的单链表(带头结点)结点为结构类型,结点值为整型。单链表操作的选择以菜单形式...

    单链表(带头结点).cpp

    实现单链表及其一些基本操作函数(带头结点) 1.头文件包含 2.宏定义及节点类型描述 3.初始化、判断是否为空 4.指定位置插入操作 5.在p节点后插入元素e 6.在p节点前插入元素e 7.删除操作:删除第i个节点,元素...

    线性表的基本操作实现及其应用实验报告

    该程序的功能是实现单链表的定义和操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。其中,程序中的单链表(带头结点)结点为结构类型,结点值为整型。单链表操作的选择以菜单形式出现,...

    《数据结构》实验指导(一).doc

    (5)验证单链表及其基本操作的实现; (6)进一步掌握数据结构及算法的程序实现的基本方法。 二、实验示例学习——顺序表操作 实验要求: (1)建立含有若干个元素的顺序表; (2)对已建立的顺序表实现插入、删除...

    linklist

    这是个集合链表 create insert delete update select print 六总操作的C语言小程序,如有问题可以联系我邮箱: 529279658@qq.com

    数据结构学习--线性表及其应用--链表

    本程序的主要目的在于帮助同学熟练掌握线性表的基本操作在链式存储结构上的...通过本实验, 对链表基本操作及其组合应用的演练,加深对链表存储方法及其基本操作的理解,为以后进 一步学习更复杂的数据结构打下基础。

    链表的交集并集差集c语言.cpp

    2、掌握在单链表上基本操作的实现。 3、在掌握单链表的基本操作上进行综合题的实现。 [实验内容及要求] 1、要求用带头结点的单链表存储两个集合中的元素和最终的结果。 2、集合的元素限定为十进制数,程序应对...

    数据结构实验一(1).doc

    题目二:单链表的基本操作(*) [问题描述] 实现带头结点的单链表的建立、求长度,取元素、修改元素、插入、删除等单链表的 基本操作。 [基本要求] (1)依次从键盘读入数据,建立带头结点的单链表; (2)输出...

    这是基本数据结构及其算法的C++实现,涉及单链表、双链表、栈 、二叉树、并查集、哈夫曼树、平衡二叉树、二叉搜索树等.zip

    数据结构、算法相关的资源 数据结构、算法相关的资源 数据结构、算法相关的资源 数据结构、算法相关的资源 数据结构、算法相关的资源 数据结构、算法相关的资源 数据结构、算法相关的资源 数据结构、算法相关的资源 ...

    C++课程设计-单链表——学生信息管理系统.docx

    此软件主要是实现对学生学籍信息进行系统化的管理,可以对学生基本信息进行添加、删除、查找、修改以及对学生成绩的管理,主要是根据学生的学号及其姓名进行操作的。该软件可以更加方便管理者管理学生学籍信息。 ...

    吉林大学软件学院2011数据结构实验题C++实现

    验证单链表及其上的基本操作。 [实验内容及要求] 1、 定义单链表类。 2、 实验验证如下算法的正确性、各种功能及指标: 1)创建单链表; 2)插入操作:分别在当前结点后、表头、表尾插入值为x的结点; 3)删除操作:...

    单链表实验的要求、代码、报告

    掌握单循环链表及其基本操作的实现。 (2)主要内容:实现单循环链表的初始化、求数据元素个数、插入、删除、取数据元素等操作;用插入法建立带头结点的单循环链表;设计一个测试主函数验证所设计单循环链表的正确性...

Global site tag (gtag.js) - Google Analytics