C#数据结构_基本概念及线性表
常见的4类数据结构: 1.集合。 2.线性结构。3.树形结构。4.图状结构。
数据结构(Data Structure)简记为 DS,是一个二元组,DS = (D,R)
其中:D 是数据元素的有限集合,R 是数据元素之间关系的有限集合。
数据的存储结构包括顺序存储结构和链式存储结构两种。C#语言中用数组来实现顺序存储结构。
算法的5个重要特征: 1.有穷性。2.确定性。3.可行性。4.输入。5.输出。
线性表:存在一对一的线性关系,一对一的关系指的是数据元素之间的位置关系
特点:(1)除第一个位置的数据 元素外,其它数据元素位置的前面都只有一个数据元素
(2)除最后一个位置的 数据元素外,其它数据元素位置的后面都只有一个元素
线性表(List)是由 n(n≥0)个相同类型的数据元素构成的有限序列。线性表通常记为:L=(a1,a2,…,ai-1,ai, ai+1,…,an),a1是线性 表中第一个位置的数据元素。an是线性表中最后一个位置 的数据元素,。n为线性表的表长,n=0 时的线性表被称 为空表(Empty List)。
线性表的接口如下所示。
public interface IListDS<T>
{
int GetLength(); //求长度
void Clear(); //清空操作
bool IsEmpty(); //判断线性表是否为空
void Append(T item); //附加操作
void Insert(T item, int i); //插入操作
T Delete(int i); //删除操作
T GetElem(int i); //取表元
int Locate(T value); //按值查找
}
线性表的顺序存储是指在内存中用一块地址连续的空间依次存放线性表的数据元素, 用这种方式存储的线性表叫顺序表(Sequence List)。顺序表的特点 是表中相邻的数据元素在内存中存储位置也相邻。数据元素占w个存储单元,设第i个数据元素的存储地址为Loc(ai),则有:Loc(ai)= Loc(a1)+(i-1)*w 1≤i≤n。
由于计算顺序表中每个数据元素存储地址的时间相同,所以顺序表 具有随机存取的特点。数组具有表示顺序表的数据存储区域的特 性。
last 表示顺序 表中最后一个数据元素在数组中的位置。如果顺序表中有数据元素时,last 的变 化范围是 0 到 maxsize-1,如果顺序表为空,last=-1
顺序表类 SeqList<T>的实现说明如下所示。
public class SeqList<T> : IListDS<T>
{
private int maxsize; //顺序表的容量
private T[] data; //数组,用于存储顺序表中的数据元素
private int last; //指示顺序表最后一个元素的位置
//索引器
public T this[int index]
{
get { return data[index]; }
set { data[index] = value; }
}
//最后一个数据元素位置属性
public int Last
{
get { return last; }
}
//容量属性
public int Maxsize
{
get { return maxsize; }
set { maxsize = value; }
}
//构造器
public SeqList(int size)
{
data = new T[size];
maxsize = size;
last = -;
}
//求顺序表的长度
public int GetLength()
{
return last + ;
}
//清空顺序表
public void Clear()
{
last = -;
}
//判断顺序表是否为空
public bool IsEmpty()
{
if (last == -)
{
return true;
}
else
{
return false;
}
}
//判断顺序表是否为满
public bool IsFull()
{
if (last == maxsize - )
{
return true;
}
else
{
return false;
}
}
//在顺序表的末尾添加新元素
public void Append(T item)
{
if (IsFull())
{
System.Console.WriteLine("满了");
return;
}
data[++last] = item;
}
//在顺序表的第i位置插入一个数据元素
public void Insert(T item, int i)
{
if (IsFull())
{
System.Console.WriteLine("满了");
return;
}
if (i < || i> last+)
{
System.Console.WriteLine("越界");
return;
}
if(i==last+)
{
data[last+]=item;
}
else
{
for (int j = last; j >= i - ; --j)
{
data[j + ] = data[j];
}
data[i - ] = item;
}
++last;
}
//删除顺序表的第i个数据元素
public T Delete(int i)
{
T tmp = default(T);
if (IsEmpty())
{
Console.WriteLine("List is empty");
return tmp;
}
if (i < || i > last + )
{
Console.WriteLine("Position is error!");
return tmp;
}
if (i == last + )
{
tmp = data[last--];
}
else
{
tmp = data[i - ];
for (int j = i; j <= last; ++j)
{
data[j] = data[j + ];
}
}
--last;
return tmp;
}
//获得顺序表的第i个数据元素
public T GetElem(int i)
{
if (IsEmpty() || (i < ) || (i > last + ))
{
Console.WriteLine("List is empty or Position is error!");
return default(T);
}
return data[i - ];
}
//在顺序表中查找值为value的数据元素
public int Locate(T value)
{
if (IsEmpty())
{
Console.WriteLine("List is Empty!");
return -;
}
int i = ;
for (i = ; i <= last; ++i)
{
if (value.Equals(data[i]))
{
break;
}
}
if (i > last)
{
return -;
}
return i;
}
}
SeqList
顺序表的倒置 算法思路:把第一个元素与最后一个元素交换,把第二个元素与倒数第二个元素交换。一般地,把第 i 个元素与第 n-i 个元素交换,i 的取值范围是 0 到 n/2(n 为顺序表的长度)。算法实现如下:
public void ReversSeqList(SeqList<int> L)
{
int tmp = 0;
int len = L.GetLength();
for (int i = 0; i<= len/2; ++i)
{
tmp = L[i];
L[i] = L[len - i];
L[len - i] = tmp;
}
}
算法思路:依次扫描 La 和 Lb 的数据元素,比较 La 和 Lb 当前数据元素的 值,将较小值的数据元素赋给 Lc,如此直到一个顺序表被扫描完,然后将未完 的那个顺序表中余下的数据元素赋给 Lc 即可。Lc 的容量要能够容纳 La 和 Lb 两个表相加的长度。
按升序合并两个表的算法 C#实现如下:
public SeqList<int> Merge(Seqlist<int> La, SeqList<int> Lb)
{
SeqList<int> Lc = new SeqList<int>(La.Maxsize + Lb.Maxsize);
int i = 0; int j = 0; int k = 0;
//两个表中都有数据元素
while ((i <= (La.GetLength()-1))&& (j <= (Lb.GetLength()-1)))
{
if (La[i] <Lb[j])
{
Lc.Append(La[i++]);
}
else
{
Lc.Append(Lb[j++]);
}
}
//a表中还有数据元素
while (i <= (La.GetLength() - 1))
{
Lc.Append(La[i++]);
}
//b表中还有数据元素
while (j <= (Lb.GetLength() - 1))
{
Lc.Append(Lb[j++]);
}
return Lc;
}
已知一个存储整数的顺序表 La,试构造顺序表 Lb,要求顺序表 Lb 中 只包含顺序表 La 中所有值不相同的数据元素
算法思路:先把顺序表 La 的第 1 个元素赋给顺序表 Lb,然后从顺序表 La 的第 2 个元素起,每一个元素与顺序表 Lb 中的每一个元素进行比较,如果不相 同,则把该元素附加到顺序表 Lb 的末尾。
public SeqList<int> Purge(SeqList<int> La)
{
SeqList<int> Lb = new SeqList<int>(La.Maxsize);
//将a表中的第1个数据元素赋给b表
Lb.Append(La[]);
//依次处理a表中的数据元素
for (int i=; i<=La.GetLength()-; ++i)
{
int j = ;
//查看b表中有无与a表中相同的数据元素
for (j = ; j<=Lb.GetLength()-; ++j)
{
//有相同的数据元素
if (La[i].CompareTo(Lb[j]) == )
{
break;
}
}
//没有相同的数据元素,将a表中的数据元素附加到b表的末尾。
if(j>Lb.GetLength()-)
{
Lb.Append(La[i]);
}
}
return Lb;
}
链表进行插入 和删除时不需要移动数据元素,但同时也失去了顺序表可随机存储的优点
单链表结点类的实现:
public class Node<T>
{
private T data; //数据域
private Node<T> next; //引用域
//构造器
public Node(T val, Node<T> p)
{
data = val;
next = p;
}
//构造器
public Node(Node<T> p)
{
next = p;
}
//构造器
public Node(T val)
{
data = val;
next = null;
}
//构造器
public Node()
{
data = default(T);
next = null;
}
//数据域属性
public T Data
{
get{return data;}
set{ data = value; }
}
//引用域属性
public Node<T> Next
{
get { return next; }
set { next = value; }
}
}
单链表类 LinkList<T>的实现
public class LinkList<T> : IListDS<T>
{
private Node<T> head; //单链表的头引用
//头引用属性
public Node<T> Head
{
get{ return head; }
set{ head = value; }
}
//构造器
public LinkList()
{
head = null;
}
//求单链表的长度
public int GetLength()
{
Node<T> p = head;
int len = ;
while (p != null)
{
++len;
p = p.Next;
}
return len;
}
//清空单链表
public void Clear()
{
head = null;
}
//判断单链表是否为空
public bool IsEmpty()
{
if (head == null)
{
return true;
}
else
{
return false;
}
}
//在单链表的末尾添加新元素
public void Append(T item)
{
Node<T> q = new Node<T>(item);
Node<T> p = new Node<T>();
if (head == null)
{
head = q;
return;
}
p = head;
while (p.Next != null)
{
p = p.Next;
}
p.Next = q;
}
//在单链表的第i个结点的位置前插入一个值为item的结点
public void Insert(T item, int i)
{
if (IsEmpty() || i < )
{
Console.WriteLine("List is empty or Position is error!");
return;
}
if (i == )
{
Node<T> q = new Node<T>(item);
q.Next = head;
head = q;
return;
}
Node<T> p = head;
Node<T> r = new Node<T>();
int j = ;
while (p.Next != null&& j < i)
{
r = p;
p = p.Next;
++j;
}
if (j == i)
{
Node<T> q = new Node<T>(item);
q.Next = p;
r.Next = q;
}
}
//在单链表的第i个结点的位置后插入一个值为item的结点
public void InsertPost(T item, int i)
{
if (IsEmpty() || i < )
{
Console.WriteLine("List is empty or Position is error!");
return;
}
if (i == )
{
Node<T> q = new Node<T>(item);
q.Next = head.Next; head.Next = q; return;
}
Node<T> p = head;
int j = ;
while (p != null&& j < i)
{
p = p.Next;
++j;
}
if (j == i)
{
Node<T> q = new Node<T>(item);
q.Next = p.Next;
p.Next = q;
}
}
//删除单链表的第i个结点
public T Delete(int i)
{
if (IsEmpty()|| i < )
{
Console.WriteLine("Link is empty or Position is error!");
return default(T);
}
Node<T> q = new Node<T>();
if (i == )
{
q = head;
head = head.Next;
return q.Data;
}
Node<T> p = head;
int j = ;
while (p.Next != null&& j < i)
{
++j;
q = p;
p = p.Next;
}
if (j == i)
{
q.Next = p.Next;
return p.Data;
}
else
{
Console.WriteLine("The ith node is not exist!");
return default(T);
}
}
//获得单链表的第i个数据元素
public T GetElem(int i)
{
if (IsEmpty())
{
Console.WriteLine("List is empty!");
return default(T);
}
Node<T> p = new Node<T>();
p = head;
int j = ;
while (p.Next != null&& j < i)
{
++j;
p = p.Next;
}
if (j == i)
{
return p.Data;
}
else
{
Console.WriteLine("The ith node is not exist!");
return default(T);
}
}
//在单链表中查找值为value的结点
public int Locate(T value)
{
if(IsEmpty())
{
Console.WriteLine("List is Empty!");
return -;
}
Node<T> p = new Node<T>();
p = head;
int i = ;
while (!p.Data.Equals(value)&& p.Next != null)
{
P = p.Next;
++i;
}
return i;
}
}
C#数据结构_基本概念及线性表的更多相关文章
- JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)
前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...
- 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解
数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...
- 【Java数据结构学习笔记之一】线性表的存储结构及其代码实现
应用程序后在那个的数据大致有四种基本的逻辑结构: 集合:数据元素之间只有"同属于一个集合"的关系 线性结构:数据元素之间存在一个对一个的关系 树形结构:数据元素之间存在一个对多个关 ...
- 数据结构与算法系列2 线性表 链表的分类+使用java实现链表+链表源码详解
数据结构与算法系列2.2 线性表 什么是链表? 链表是一种物理存储单元上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表的链接次序实现的一系列节点组成,节点可以在运行时动态生成,每个节点包括两个 ...
- 数据结构C语言实现系列——线性表(线性表链接存储(单链表))
#include <stdio.h>#include <stdlib.h>#define NN 12#define MM 20typedef int elemType ;/** ...
- javascript实现数据结构与算法系列:线性表的静态单链表存储结构
有时可借用一维数组来描述线性链表,这就是线性表的静态单链表存储结构. 在静态链表中,数组的一个分量表示一个结点,同时用游标(cur)代替指针指示结点在数组中的相对位置.数组的第0分量可看成头结点,其指 ...
- C语言数据结构基础学习笔记——基础线性表
线性表是指具有相同数据类型的n(n>=0)个数据元素的有限序列,它具有一个表头元素和一个表尾元素,并且每一个数据元素最多只有一个直接前驱和一个直接后继. 线性表的顺序存储也叫作顺序表,它的特性是 ...
- 《数据结构与STL-第二章 线性表》读书笔记
线性表 定义 线性表(linear list)是由零个或多个相同类型的数据元素构成的有限序列. 存储结构 顺序存储 最简单的存储方法是顺序存储法,即把线性表的数据元素按照逻辑次序顺序地放在一组地址连续 ...
- 数据结构C语言实现系列——线性表(单向链表)
#include <stdio.h> #include <stdlib.h> #define NN 12 #define MM 20 typedef int elemType ...
随机推荐
- Java简单公式计算器
最近给公司开发业务代码时,碰到一个场景,简单描述是这样的: 客户要向咱们公司定制一件产品,这个产品呢,有很多属性,那公司得根据这些属性报价呀,怎么报价呢?公司针对某种类型的产品有一个基准价,在同类产品 ...
- python课堂整理16---内置函数
1. abs :求绝对值 print(abs(-1)) 2. all()传入一个可迭代对象,对该对象进行bool值运算,若都为True 就返回True,有一个为假,就返回False print(all ...
- 基于V2EX API的nodejs组件.
今天又学习到了新的知(zi)识(shi),来给自己做个笔录,也算在这酷热的天气里给自己写了一篇降温的‘膏药’,话就讲这么多了 ,start off...... 首先 ,依赖选择: /**设置为严格模式 ...
- HPU暑期集训积分赛1
A. Nth power of n 单点时限: 1.0 sec 内存限制: 512 MB 求 nn 的个位数. 输入格式 多组输入,处理到文件结束.每组数据输入一个 n.(1≤n≤109) 输出格式 ...
- BGP属性控制实验
目录 实验拓扑 实验需求 实验步骤 个人小结: 实验拓扑 实验需求 更改BGP路由的属性让R4访问R1优先选R2这条路 实验步骤 1. 按照图示配置IP地址及环回口地址 R1 [R1]int g0/0 ...
- Maven安装和配置环境变量
Maven配置 1.下载 下载maven 3.5.4 先到官网http://maven.apache.org/download.cgi 下载最新版本(目前是3.5.4 ),下载完成后,解压到某个目录( ...
- 表单与v-model
基本用法 vue.js提供了v-model指令,用于在表单类元素上双向绑定数据,例如在输入框上使用,输入的内容会实时映射到绑定的数据上 example1:修改input框内容,message会实时渲染 ...
- abp(net core)+easyui+efcore实现仓储管理系统目录
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
- oracle 正确删除归档日志,并清除 V$ARCHIVED_LOG 数据
1. 连接 RMAN 管理 rman target / 2. 查看归档日志列表 RMAN> crosscheck archivelog all; 3. 删除所有归档日志 RMAN> DEL ...
- 原生js实现图片懒加载+加入节流
这两天在学习图片的懒加载实现,看了很多大佬的博客,终于有了点成果.现在用了其中一位大佬的文章中的代码实现了图片懒加载并且在其基础上加入了节流函数. 原理就不多讲了,有需要的可以去大佬的文章看看.大佬文 ...