IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构与算法(陈越版)第二讲 线性结构—线性表及其表现 -> 正文阅读

[数据结构与算法]数据结构与算法(陈越版)第二讲 线性结构—线性表及其表现

一、线性表的定义

线性表(Linear List):由同一类型的数据元素构成的有序序列的线性结构

线性表中元素的个数称为线性表的长度

表起始位置称为:表头,表结束位置称为:表尾。

二、线性表的抽象数据类型描述

类型名称:线性表(List)

数据对象集: 线性表是 n ( ≥ n ) n ( \geq n) n(n)个元素构成的有序序列 ( a 1 , a 2 , . . . , a n ) (a_1, a_2,...,a_n) (a1?,a2?,...,an?)

操作集:初始化,查找,插入,删除等等。

三、线性表的实现

3.1、线性表的顺序存储实现

# include<iostream>
using namespace std;
# define MaxSize 100
# include<malloc.h>

typedef int ElementType;

// 创建顺序储存的结构体
typedef int Position;
struct LNode
{
	ElementType Data[MaxSize];
	Position Last;
};
typedef LNode * List;

// 初始化
List CreateList()
{
	List L = (List)malloc(sizeof(struct LNode));
	L->Last = -1;
	return L;
}

// 插入
void  Insert(ElementType x, int i, List L)
{
	//判断是否已经满了
	if (L->Last == MaxSize - 1)
	{
		cout << "线性表已经满了" << endl;
		return;
	}
	if (i < 0 || i >= MaxSize)
	{
		cout << "插入不合法" << endl;
		return;
	}
	// 插入数据前,移动i-1之后的数据
	for (int j = L->Last; j >= i; --j)
	{
		L->Data[j + 1] = L->Data[j];
	}
	L->Data[i] = x;
	++L->Last;
	return;
}

// 按值查找
int Findx(ElementType x, List L)
{
	int i = 0;

	while (i <= L->Last && L->Data[i] != x)
		++i;
	if (i > L->Last)
	{
		cout << "查找元数不在线性表中" << endl;
		return -1;
	}	
	else
	    return i;
}

// 按位数查找,即:查找下标为k个元素
ElementType FindK(int k, List L)
{
	if (k < 0 || k > L->Last)
	{
		cout << "下标为" << k << "的元素不存在" << endl;
		return -1;
	}
	else
		return L->Data[k];
}

// 删除  从L中删除下标为i的值,不返回其值
void Delete(int i, List L)
{
	//位置不合适
	if (i < 0 || i > L->Last)
	{
		cout << "下标为" << i << "的元素不存在" << endl;
	}
	// 移动数据直接覆盖
	for (int j = i; j < L->Last; ++j)
	{
		L->Data[j] = L->Data[j + 1];
	}
	--L->Last;
	return;
}


int main()
{
	List L = CreateList();    // 初始化

	// 插入数据成功
	Insert(11, 0, L);
	Insert(25, 0, L);
	Insert(33, 0, L);
	Insert(77, 0, L);
	Insert(85, 2, L);

	for (int i = 0; i <= L->Last; ++i)
	{
		cout << L->Data[i] << " ";
	}
	cout << endl;

	// 插入失败
	Insert(60, 102, L);

	// 按值查找成功
	int a = Findx(25, L);  
	cout << "25的位置在:" << a << endl;

	// 按值查找失败
	a = Findx(90, L);

	// 按下标查找成功
	int X = FindK(4, L);
	cout << "下标为4的元素是: " << X << endl;

	// 按下标查找失败
	X = FindK(20, L);

	// 删除成功
	Delete(3, L);
	cout << "删除之后的排序" << endl;
	for (int i = 0; i <= L->Last; ++i)
	{
		cout << L->Data[i] << " ";
	}
	cout << endl;

	// 删除失败
	Delete(20, L);

	return 0;
}

3.2、线性表的链式储存方式

# include<iostream>
# include<malloc.h>
using namespace std;

// 构建链式结点结构体
typedef struct LNode * PLNode;
typedef int ElementType;
typedef int Position;
struct LNode
{
	ElementType Data;
	PLNode Next;
};
typedef PLNode List;
// 初始化

List CreateList()
{
	List L = (List)malloc(sizeof(struct LNode));
	L = NULL;
	return L;
}

// 求链表长度
int Length(List L)
{
	int count = 0;
	while (L)
	{
		L = L->Next;
		++count;
	}
	return count;
}

// 位置查找
List FindK(int K, List L)
{
	int i = 1;
	List P = L;
	while (P && i < K)
	{
		P = P->Next;
		++i;
	}
	if (i == K)
		return P;
	else
	{
		cout << "查找失败" << endl;
		return NULL;
	}
		
}

// 插入数据
List Insert(ElementType X, int i, List L)
{
	List P = L;
	List s,p;
	
	p = (List)malloc(sizeof(struct LNode));
	p->Data = X;
	p->Next = NULL;

	if (i == 1)
	{
		p->Next = P;
		return p;
	}
    s = FindK(i - 1, P);
	
	if(s == NULL)
	{
		cout << "插入位置有误" << endl;
		return NULL;
	}
	else
	{
		p->Next = s->Next;
		s->Next = p;
	}
	return P;
}


// 按数值查找
int Findx(ElementType X, List L)
{
	int i = 1;
	List P = L;
	while (P && P->Data != X)
	{
		P = P->Next;
		++i;
	}
	if (P)
		return i;
	else 
		cout << "查找失败" << endl;
	return 0;

		
}

// 删除链表的第i个结点
List Delete(int i, List L)
{
	List tmp, s;
	if (i == 1)
	{
		tmp = L;
		if (L)
			L = L->Next;
		else
			return NULL;
		free(tmp);
		return L;
	}
	s = FindK(i-1, L);

	if (!s || !(s->Next))
	{
		cout << "释放的位置节点错误" << endl;
		return NULL;
	}
	else 
	{
		tmp = s->Next;        // 第i个结点
		s->Next = tmp->Next;
		
		free(tmp);
		return L;
	}
	
}


// 按链表顺序打印L的元素
void print(List L)
{
	while (L)
	{
		cout << L->Data << " ";
		L = L->Next;
	}
	cout << endl;
}

int main()
{
	List L = CreateList();
	int i = 0;
	List P;

	// 插入数据
	L = Insert(22, 1, L);
	L = Insert(50, 1, L);
	L = Insert(64, 1, L);
	L = Insert(70, 2, L);
	L = Insert(55, 4, L);

	// 计算长度
	int len = Length(L);
	cout << "链表长度为:" << len << endl;

	// 打印列表数值
	print(L);

	// 位置查找 成功
	P = FindK(3, L);
    cout << "第3个结点元素为:" << P->Data << endl;

	// 位置查找 失败
	P = FindK(7, L);

	// 元素查找 成功
	Position pt = Findx(22, L);
	cout << "22这个元素在第" << pt << "结点" << endl;

	// 元素查找 失败
	pt = Findx(80, L);

	// 删除结点 成功
	L = Delete(2, L);
	
	cout << "删除第二个结点后的链表排序:" << endl;
	print(L);

	// 删除 失败
	L = Delete(7, L);
	return 0;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-14 23:11:55  更:2021-07-14 23:12:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 19:56:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码