数据结构——线性表(第二章)

一、基本概念

1、线性表:简称表,是n(n>=0)个具有相同类型的数据元素的有限序列,线性表中数据元素的个数称为线性表的长度。长度为零时称为空表。

2、线性表的顺序存储结构称为顺序表。

3、单链表:单链表是一组任意的存储单元存放线性表的位置,这组存储单元可以连续也可以不连续,甚至可以零散分布在内存中的任意位置。

下面着重介绍有关单链表的操作:

#include<iostream>
using namespace std;

const int maxsize = 10;

 //  定义单链表的结点
struct Node
{
	int data;
	struct Node *next;
};

//  linklist 类的声明
class linklist
{
	public:
		linklist();					//	建立只有头结点的单链表
		linklist(int a[],int n);	//  建立有N个元素的单链表
		~linklist();				//  析构函数
		void insert(int i,int x);	//  在单链表的第 i 个位置插入元素值为 x 的结点
		int Delete(int  i);			//  在单链表中删除第 i 个结点
		int locate(int x);			//  在单链表中 按值 查找 元素为x的元素 的位置(序号)
		void printlist();			//  按序号依次输出各元素
	private :
		Node *first;				//  单链表的头指针。
};

linklist::linklist()
{
	first = new Node;				//   生成头结点
	first ->next=NULL;				//   头结点指针域 置空
}

linklist::linklist(int a[],int n)
{
	Node *r,*s;
	first = new Node;				//   生成头结点
	r = first; 						//   尾指针 初始化
	for(int i = 0;i<n;i++)
	{
		s=new Node;
		s->data= a[i];				//	 为每个元素建立一个结点
		r->next= s;r=s;				//   将结点s插入到终端结点之后
	}
	r->next = NULL;					//	 将终端指针域置空
}

linklist::~linklist()
{
	Node *q = NULL;
	while(first!=NULL)
	{
		q = first;
		first = first->next;
		delete q;
	}
}

void linklist::insert(int i,int x)
{
	Node *p = first,*s = NULL;		//  工作指针p指向头结点
	int count = 0;
	while(p!=NULL&&count<i-1)		//  查找第 i - 1个结点
	{
		p = p->next;
		count++;
	}
	if(p==NULL) throw "位置";
	//   	将结点s 插入到p所指的i - 1 之后
	else{
		s= new Node;s->data= x;
		s->next=p->next;
		p->next = s;
	}
}

int linklist::Delete(int i)
{
	Node *p = first,*q=NULL;
	int x;
	int count = 0;
	while(p!=NULL&&count<i-1)
	{
		p = p->next;
		count++;
	}
	//  因为我们上面查找的是i - 1这个位置,删除的却是 i ,所以p-> next 也不能为空
	if(p == NULL&&p->next ==NULL)    //  这里很重要!!结点p 或 p的后继结点不存在
		throw"位置";
	else{
		q = p->next;x = q->data;	//   暂存被删结点
		p->next = q->next;			//   摘链
		delete q;
		return x;
	}
}

int linklist::locate(int x)
{
	Node *p = first -> next;		//工作指针p初始化
	int count = 1;
	while(p != NULL)
	{
		if(p -> data == x) return count;
		p = p -> next;
		count++;
	}
	return 0;
}

void linklist::printlist()
{
	Node  *p = first->next;
	while(p!=NULL)
	{
		cout<<p->data<<" ";
		p=p->next;
	}
	cout<<endl;
}

int main()
{
	int r[5]={1,2,3,4,5};
	linklist L(r,5);		// 建立单链表!
	cout<<"执行操作前数据为:"<<endl;
	L.printlist();
	try
	{
		L.insert(2,3);       // 在第二个位置插入3.
	}
	catch(char *s)
	{
		cout<<s<<endl;
	}
	cout<<"执行插入操作后的数据"<<endl;
	L.printlist();
	cout<<"值为5的元素 位置 为:";
	cout<<L.locate(5)<<endl;
	cout<<"执行删除操作前的数据为"<<endl;
	L.printlist();
	try
	{
		L.Delete(1);       // 删除第一个位置的元素;
	}
	catch(char *s)
	{
		cout<<s<<endl;
	}
	cout<<"执行删除操作后的数据为:"<<endl;
	L.printlist();
	return 0;
}

4、循环链表:在单链表中,如果将终端结点的指针域由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为循环单链表,简称循环链表。

5、双链表: 在循环链表中,虽然从任一结点出发可以扫描到其他结点,但要找到其他前驱结点,则需要遍历整个循环链表。如果希望快速确定表中任一结点的前驱结点,可以在单链表的每个结点中再设置一个指向其前驱结点的指针域,这样就形成了双链表。

6、静态链表:静态链表是用数组来表示单链表,用数组元素的下标来模拟单链表的指针。

7、间接寻址:是将数组和指针结合起来的一种方法,它将数组中存储数据元素的单元改为存储指向该元素的指针。

数据结构——线性表(第二章)

时间: 2024-10-20 19:09:17

数据结构——线性表(第二章)的相关文章

[考研系列之数据结构]线性表之字符串

基本概念 串(字符串)  由0个或多个字符组成的有限序列,例如s="hello world" 串名  上例中的s 子串  某串任意连续字符组成的子序列,称为此字符串的子串 空串  0个字符的串,s="" 空格串  由一个或多个字符组成的串 模式匹配算法 作用 定位某子串T在字符串S中的位置 主串 S 模式串  T 针对模式匹配算法从简到难我们需要了解两种算法: [1] 朴素的模式匹配算法 [2] KMP匹配算法 朴素的模式匹配算法: 所谓朴素就是简单,这是一种简单的

java实现数据结构-线性表-顺序表,实现插入,查找,删除,合并功能

package 顺序表; import java.util.ArrayList; import java.util.Scanner; public class OrderList { /** * @param args * @author 刘雁冰 * @2015-1-31 21:00 */ /* * (以下所谓"位置"不是从0开始的数组下标表示法,而是从1开始的表示法.) * (如12,13,14,15,16数据中,位置2上的数据即是13) * * 利用JAVA实现数据结构-线性表-顺

数据结构-线性表_顺序表

进入大学一年了,今日终于有勇气写写随笔并展示出来了. 如有不足之处,请大家指正. 今日我想写的就是我对数据结构-线性表_顺序表的理解. 不BB了,进入正题!!!!! 数据结构中的逻辑结构分为线性结构和非线性结构,而线性表就属于线性结构. 线性结构是 n 个数据元素的有序(次序)集合,它有下列几个特征: 集合中必存在唯一的一个 "第一个元素": 集合中必存在唯一的一个 "最后的元素": 除最后元素之外,其它数据元素均有唯一的 "后继": 除第一元素

数据结构线性表链表的C语言实现

                                                                                      数据结构线性表链表的C语言实现      说明:线性表是一种最简单的线性结构,也是最基本的一种线性结构,所以它不仅是学习中的重点,也是应用开发非常常用的一种数据结构.它可以分为顺序表和链表.它的主要操作是数据元素的插入,删除,以及排序等.接下来,本篇文章将对线性表链表的基本操作和运用进行详细的说明(包含在源代码的注释中),并给

[考研系列之数据结构]线性表之队列

基本概念 队列的定义 队列是一种只能在表的一头插入,另一头删除的线性表,简而言之具有FIFO的特性 组成 队头 队尾 扩展 双端队列 只能在两端进行删除插入操作的线性表 实现 链队列 顺序队列 循环队列 循环队列 循环队列是将顺序队列臆造成一个环,如图 循环队列有以下参数 front 指向队头的指针 rear 指向队尾的指针 SIZE 循环最大队列长度 对于循环队列,初始状态的时候 front=rear=0; 每次insert的时候 Insert((front++)%SIZE); 那么,当循环队

[考研系列之数据结构]线性表之栈

?基本概念 栈的定义 限定仅在表尾进行插入或删除的线性表 组成 栈顶 栈底 基本操作 入栈(PUSH) 往栈中插入一个元素 弹栈(POP) 从栈顶删除一个元素 栈的表示 顺序栈 链栈 对于顺序栈,有两个指针base和top base指向栈底 top指向栈顶 对于栈的一些基本情况: 栈不存在时候 base=NULL 栈为空时  top=base 栈的长度 top-base 链栈略过. 栈的应用 1 数制转换 数制转换我们使用一种称之为"辗转相除法"的算法.此算法的基本原理基于: N=(N

数据结构-线性表(2)

线性表定义: 线性表是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表的逻辑结构简单,便于实现和操作.因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构. 存储空间是否连续: 一.顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配. 优点: (1)方法简单,各种高级语言中都有数组,容易实现. (2)不用为表示节点间的逻辑关系而增加额外的存储开

数据结构&gt;&gt;线性表【注意】--&gt;链表求A-B(原A与B都递增,求完的A-B不改变A原来的顺序)

/*关于链表的题目 * A.B是两个递增有序的单链表,元素个数分别是m和n,求 * 集合A-B,并将结果保存在A中,且仍然保持递增有序. * converge_ab */ #include <iostream.h> using namespace std; typedef struct lnode{ int data; struct lnode * next; }lnode; int main(){ lnode * create_chain(int num,int interval,int s

[考研系列之数据结构]线性表概述

1.脑图 2.表示方法 按照数据结构概述所说,线性表有两种表示方法分别是顺序表示和链式表示,链表就是链式表示的典型. 我们知道链式表示是分配了n块内存空间,可以认为彼此不连续,所以不能用偏移量去定位每个元素. 下面就先说最简单的单向链表: 如果每个数据元素能有一个指针指向下一个元素的话,那么只需要知道第一个数据元素就能一个一个的遍历整个链表了,这就是单向链表. 对于每个链表元素我们称之为节点,每个节点都有两个域:数据域&指针域 数据域就是数据元素所在的区域,而指针域则是存储指向另一个节点的指针的