C#實(shí)現(xiàn)順序表(線性表)完整實(shí)例
本文實(shí)例講述了C#實(shí)現(xiàn)順序表(線性表)的方法。分享給大家供大家參考,具體如下:
基本思想是使用數(shù)組作為盛放元素的容器,數(shù)組一開始的大小要實(shí)現(xiàn)確定,并使用一個(gè)Pointer指向順序表中最后的元素。順序表中的元素是數(shù)組中元素的子集。順序表在內(nèi)存中是連續(xù)的,優(yōu)勢(shì)是查找,弱勢(shì)是插入元素和刪除元素。
為避免裝箱拆箱,這里使用泛型,代替object。使用object的例子可以參照本站這篇文章:http://www.dhdzp.com/article/87603.htm,這個(gè)鏈接中的例子實(shí)現(xiàn)的是隊(duì)列,并沒 有使用Pointer來(lái)標(biāo)識(shí) 順序表中最后一個(gè)元素,而是動(dòng)態(tài)的調(diào)整數(shù)組的大小,這與本例明顯不同,動(dòng)態(tài)調(diào)整數(shù)組大小開銷較大。使用object同樣可以完成順序表數(shù)據(jù)結(jié)構(gòu),但是頻繁裝箱拆箱造成較大的開銷,應(yīng)使用泛型代替。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LinearList
{
public interface IListDS<T>
{
int GetLength();
void Insert(T item, int i);
void Add(T item);
bool IsEmpty();
T GetElement(int i);
void Delete(int i);
void Clear();
int LocateElement(T item);
void Reverse();
}
//順序表類
class SequenceList<T>:IListDS<T>
{
private int intMaxSize;//最大容量事先確定,使用數(shù)組必須先確定容量
private T[] tItems;//使用數(shù)組盛放元素
private int intPointerLast;//始終指向最后一個(gè)元素的位置
public int MaxSize
{
get { return this.intMaxSize; }
set { this.intMaxSize = value; }
}
public T this[int i]//索引器方便返回
{
get { return this.tItems[i]; }
}
public int PointerLast
{
get { return this.intPointerLast; }
}
public SequenceList(int size)
{
this.intMaxSize = size;
this.tItems = new T[size];//在這里初始化最合理
this.intPointerLast = -1;//初始值設(shè)為-1,此時(shí)數(shù)組中元素個(gè)數(shù)為0
}
public bool IsFull()//判斷是否超出容量
{
return this.intPointerLast+1 == this.intMaxSize;
}
#region IListDS<T> 成員
public int GetLength()
{
return this.intPointerLast + 1;//不能返回tItems的長(zhǎng)度
}
public void Insert(T item, int i)//設(shè)i為第i個(gè)元素,從1開始。該函數(shù)表示在第i個(gè)元素后面插入item
{
if (i < 1 || i > this.intPointerLast + 1)
{
Console.WriteLine("The inserting location is wrong!");
return;
}
if (this.IsFull())
{
Console.WriteLine("This linear list is full! Can't insert any new items!");
return;
}
//如果可以添加
this.intPointerLast++;
for(int j=this.intPointerLast;j>=i+1;j--)
{
this.tItems[j] = this.tItems[j - 1];
}
this.tItems[i] = item;
}
public void Add(T item)
{
if (this.IsFull())//如果超出最大容量,則無(wú)法添加新元素
{
Console.WriteLine("This linear list is full! Can't add any new items!");
}
else
{
this.tItems[++this.intPointerLast] = item;//表長(zhǎng)+1
}
}
public bool IsEmpty()
{
return this.intPointerLast == -1;
}
public T GetElement(int i)//設(shè)i最小從0開始
{
if(this.intPointerLast == -1)
{
Console.WriteLine("There are no elements in this linear list!");
return default(T);
}
if (i > this.intPointerLast||i<0)
{
Console.WriteLine("Exceed the capability!");
return default(T);
}
return this.tItems[i];
}
public void Delete(int i)//設(shè)i最小從0開始
{
if (this.intPointerLast == -1)
{
Console.WriteLine("There are no elements in this linear list!");
return;
}
if (i > this.intPointerLast || i < 0)
{
Console.WriteLine("Deleting location is wrong!");
return;
}
for (int j = i; j < this.intPointerLast; j++)
{
this.tItems[j] = this.tItems[j + 1];
}
this.intPointerLast--;//表長(zhǎng)-1
}
public void Clear()
{
this.intPointerLast = -1;
}
public int LocateElement(T item)
{
if (this.intPointerLast == -1)
{
Console.WriteLine("There are no items in the list!");
return -1;
}
for (int i = 0; i <= this.intPointerLast; i++)
{
if (this.tItems[i].Equals(item))//若是自定義類型,則T類必須把Equals函數(shù)override
{
return i;
}
}
Console.WriteLine("Not found");
return -1;
}
public void Reverse()
{
if (this.intPointerLast == -1)
{
Console.WriteLine("There are no items in the list!");
}
else
{
int i = 0;
int j = this.GetLength() / 2;//結(jié)果為下界整數(shù),正好用于循環(huán)
while (i < j)
{
T tmp = this.tItems[i];
this.tItems[i] = this.tItems[this.intPointerLast - i];
this.tItems[this.intPointerLast - i] = tmp;
i++;
}
}
}
#endregion
}
class Program
{
static void Main(string[] args)
{
}
}
}
基于順序表的合并排序:
//基于順序表的合并排序
static private SequenceList<int> Merge(SequenceList<int> s1,SequenceList<int> s2)
{
SequenceList<int> sList = new SequenceList<int>(20);
int i = 0;
int j = 0;
while(i<=s1.PointerLast&&j<=s2.PointerLast)
{
if (s1[i] < s2[j])
{
sList.Add(s1[i]);
i++;
}
else
{
sList.Add(s2[j]);
j++;
}
}
if (i > s1.PointerLast)
{
while (j <= s2.PointerLast)
{
sList.Add(s2[j]);
j++;
}
return sList;
}
else//即j>s2.PointerLast
{
while (i <= s1.PointerLast)
{
sList.Add(s1[i]);
i++;
}
return sList;
}
}
更多關(guān)于C#相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《C#數(shù)據(jù)結(jié)構(gòu)與算法教程》、《C#遍歷算法與技巧總結(jié)》、《C#程序設(shè)計(jì)之線程使用技巧總結(jié)》、《C#操作Excel技巧總結(jié)》、《C#中XML文件操作技巧匯總》、《C#常見控件用法教程》、《WinForm控件用法總結(jié)》、《C#數(shù)組操作技巧總結(jié)》及《C#面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》
希望本文所述對(duì)大家C#程序設(shè)計(jì)有所幫助。
- C#數(shù)據(jù)結(jié)構(gòu)之順序表(SeqList)實(shí)例詳解
- c#泛型學(xué)習(xí)詳解 創(chuàng)建線性鏈表
- C#常用數(shù)據(jù)結(jié)構(gòu)和算法總結(jié)
- C#模擬鏈表數(shù)據(jù)結(jié)構(gòu)的實(shí)例解析
- C#數(shù)據(jù)結(jié)構(gòu)之雙向鏈表(DbLinkList)實(shí)例詳解
- C#數(shù)據(jù)結(jié)構(gòu)之單鏈表(LinkList)實(shí)例詳解
- C#數(shù)據(jù)結(jié)構(gòu)之循環(huán)鏈表的實(shí)例代碼
- C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘五 棧和隊(duì)列
- C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘四 雙向鏈表
- C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘三 鏈表
- C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘二 線性結(jié)構(gòu)
- C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘一
- C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘二
相關(guān)文章
Unity 點(diǎn)擊UI與點(diǎn)擊屏幕沖突的解決方案
這篇文章主要介紹了Unity 點(diǎn)擊UI與點(diǎn)擊屏幕沖突的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
SQL+C#實(shí)現(xiàn)獲得當(dāng)前月的第一天與最后一天
本文分享了SQL+C#獲得當(dāng)前月的第一天與最后一天的代碼實(shí)例,代碼簡(jiǎn)潔,適合初學(xué)者參考。需要的朋友可以看下2016-12-12
C#窗體-數(shù)據(jù)庫(kù)連接及登錄功能的實(shí)現(xiàn)案例
這篇文章主要介紹了C#窗體-數(shù)據(jù)庫(kù)連接及登錄功能的實(shí)現(xiàn)案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
c#實(shí)現(xiàn)將pdf轉(zhuǎn)文本的示例分享
這篇文章主要介紹了c#實(shí)現(xiàn)將pdf轉(zhuǎn)文本的示例,需要的朋友可以參考下2014-03-03
C#實(shí)現(xiàn)餐飲管理系統(tǒng)完整版
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)餐飲管理系統(tǒng)的完整版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
Unity實(shí)現(xiàn)大轉(zhuǎn)盤的簡(jiǎn)單筆記
這篇文章主要為大家分享了Unity實(shí)現(xiàn)大轉(zhuǎn)盤的簡(jiǎn)單筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
C#實(shí)現(xiàn)簡(jiǎn)單的窗口抖動(dòng)
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)簡(jiǎn)單的窗口抖動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11

