惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Webroot Blog
Webroot Blog
U
Unit 42
A
About on SuperTechFans
宝玉的分享
宝玉的分享
月光博客
月光博客
C
CERT Recently Published Vulnerability Notes
P
Privacy International News Feed
Microsoft Security Blog
Microsoft Security Blog
G
Google Developers Blog
P
Privacy & Cybersecurity Law Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
S
Securelist
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Spread Privacy
Spread Privacy
L
Lohrmann on Cybersecurity
Apple Machine Learning Research
Apple Machine Learning Research
K
Kaspersky official blog
Hugging Face - Blog
Hugging Face - Blog
B
Blog
I
Intezer
Last Week in AI
Last Week in AI
T
Threat Research - Cisco Blogs
V
V2EX
L
LangChain Blog
AI
AI
G
GRAHAM CLULEY
T
Tor Project blog
人人都是产品经理
人人都是产品经理
D
Docker
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
I
InfoQ
Y
Y Combinator Blog
C
Comments on: Blog
GbyAI
GbyAI
www.infosecurity-magazine.com
www.infosecurity-magazine.com
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tailwind CSS Blog
aimingoo的专栏
aimingoo的专栏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
腾讯CDC
N
News and Events Feed by Topic
MyScale Blog
MyScale Blog
H
Help Net Security
Vercel News
Vercel News
T
Tenable Blog
博客园 - 三生石上(FineUI控件)
爱范儿
爱范儿

博客园 - LevinLee

单线程与多线程插入大量数据对比 11.明月如何代表我的心 -- 装饰模式 10.生亦何欢巧遇良姻缘 -- 桥接模式 9.嫁接品种火爆搞科研 -- 适配器模式 8.忙里偷闲聚众奔庆典 -- 创建型模式总结 2 7.忙里偷闲聚众奔庆典-- 创建型模式总结 1 6.遛弯儿撞上个创世神-- 原型模式 5.生产过程出套路 -- 建造者模式 4.像个公司喔 -- 抽象工厂模式 3.要撒了欢的干 -- 工厂方法模式 2.看你怎么致富 -- 简单工厂模式 1.让你走哪边你走哪边-- 单例模式 0.本故事难也难不住你-- 不是前言的开端 存储优化 - 删除重复记录只保留单条 Kerberos协议 闪电咂摸软件隐喻与建模 SPSite、SPWeb对象模型(转winos.cn) 用户登记与满意度评估的业务流程处理 博客开通了,开卷有益,纪念一下
数据结构简明备忘录 - 线性表
LevinLee · 2010-03-03 · via 博客园 - LevinLee

线性表

 
线性表是线性结构的抽象,线性结构的特点是结构中的数据元素之间存在一对一的线性关系。
数据元素之间的位置关系是一个接一个的排列:
1.除第一个位置的数据元素外,其他数据元素位置的前面都只有一个数据元素。
2.除最后一个位置的外,其他数据元素位置的后面都只有一个元素。

线性表通常表示为:L=(D,R)
D是数据元素的有限集合
R是数据元素之间关系的有限集合

 线性表的基本操作:

1 public interface IListDS<T> {
2 int GetLength(); //求长度
3   void Clear(); //清空
4   bool IsEmpty(); //判空
5   void Append(T item); //附加
6   void Insert(T item, int i); //插入
7   T Delete(int i); //删除
8   T GetElement(int i); //取表元素
9   int Locate(T value); //按值查找
10   }

 顺序表

 顺序表是线性表的顺序存储(Sequence Storage),是指在内存中用一块地址连续的空间依次存放线性表的数据元素(Sequence List),具有随机存取的特点。 

w: 每个数据元素占w个存储单元
A1:顺序表的基地址(Base Address)
Loc(Ai)
=Loc(A1)+(i-1)*w 1<=i<=n

为了理解顺序表,闪电学习了这样一个例题,有兴趣的朋友可以在自己的机器上写一下。

有数据类型为整型的顺序表La和Lb,其数据元素均按从小到大的升序排列,编写一个算法将它们合并成一个表Lc,要求Lc中数据元素也按升序排列。

算法思路:

依次扫描La和Lb的数据元素,比较La和Lb当前数据元素的值,将较小值的数据元素赋给Lc,如此直到一个顺序表被扫描完,然后将未完的那个顺序表中余下的数据元素赋给Lc即可。Lc的容量要能够容纳La和Lb两个表相加的长度。

思路图示:

1 public class SeqList<T> : IListDS<T> {
2 private int maxsize; //顺序表的容量
3   private T[] data; //数组,用于存储顺序表中的数据元素
4   private int last; //指示顺序表最后一个元素的位置
5
6 //构造器
7   public SeqList(int size)
8 {
9 data = new T[size];
10 maxsize = size;
11 last = -1; //如果顺序表为空,last=-1
12   }
13 //索引器
14   public T this[int index]
15 {
16 get { return data[index]; }
17 set { data[index] = value; }
18 }
19 //最后一个元素的位置属性
20   public int Last
21 {
22 get { return last; }
23 }
24 //容量属性
25 public int Maxsize
26 {
27 get { return maxsize; }
28 set { maxsize = value; }
29 }
30 //判断顺序表是否为空
31 public bool IsEmpty()
32 {
33 if (last == -1)
34 return true;
35 else
36 return false;
37 }
38 //判断顺序表是否为满
39 public bool IsFull()
40 {
41 if (last == maxsize - 1)
42 return true;
43 else
44 return false;
45 }
46 //求顺序表的长度
47 public int GetLength()
48 {
49 return last + 1;
50 }
51 //清空顺序表
52 public void Clear()
53 {
54 last = -1;
55 }
56 //在顺序表末尾添加新元素
57 public void Append(T item)
58 {
59 if (IsFull())
60 {
61 Console.WriteLine("List is full.");
62 return;
63 }
64 data[++last] = item;
65 }
66
67 //在顺序表第i个数据元素位置插入一个数据元素
68 public void Insert(T item, int i)
69 {
70 if (IsFull())
71 return;
72 if (i < 1 || i > last + 2)
73 return;
74 if (i == last + 2)
75 data[last + 1] = item;
76 else
77 {
78 for (int j = last; j >= i - 1; --j)
79 {
80 data[j + 1] = data[j];
81 }
82 data[i - 1] = item;
83 }
84 ++last;
85 }
86 //删除顺序表的第i个数据元素
87 public T Delete(int i)
88 {
89 T tmp = default(T);
90 if (IsEmpty())
91 return tmp;
92 if (i < 1 || i > last + 1)
93 return tmp;
94 if (i == last + 1)
95 tmp = data[last--];
96 else
97 {
98 tmp = data[i - 1];
99 for (int j = i; j <= last; ++j)
100 data[j] = data[j + 1];
101 }
102 --last;
103 return tmp;
104 }
105 //获得顺序表的第i个数据元素
106 public T GetElement(int i)
107 {
108 if (IsEmpty() || (i < 1) || (i > last + 1))
109 return default(T);
110 return data[i-1];
111 }
112 //在顺序表中查找值为value的数据元素
113 public int Locate(T value)
114 {
115 if (IsEmpty())
116 return -1;
117 int i = 0;
118 for (i = 0; i <= last; ++i)
119 {
120 if (value.Equals(data[i]))
121 break;
122 }
123 if (i > last)
124 return -1;
125 return i;
126 }
127 }

1 public class GenericList
2 {
3 public GenericList()
4 { }
5 public SeqList<int> Merge(SeqList<int> La, SeqList<int> Lb)
6 {
7 SeqList<int> Lc = new SeqList<int>(La.Maxsize+Lb.Maxsize);
8 int i = 0;
9 int j = 0;
10 int k = 0;
11
12 //两个表中元素都不为空
13 while ((i <= (La.GetLength() - 1)) && (j <= (Lb.GetLength() - 1)))
14 {
15 if (La[i] < Lb[j])
16 Lc.Append(La[i++]);
17 else
18 Lc.Append(Lb[j++]);
19 }
20 //a表中还有数据元素
21 while (i <= (La.GetLength() - 1))
22 Lc.Append(La[i++]);
23 //b表中还有数据元素
24 while (j <= (Lb.GetLength() - 1))
25 Lc.Append(Lb[j++]);
26 return Lc;
27
28 }
29 }

 客户端代码:

1 static void Main(string[] args)
2 {
3 SeqList<int> sl1 = new SeqList<int>(4);
4 sl1.Append(1);
5 sl1.Append(3);
6 sl1.Append(4);
7 sl1.Append(7);
8
9 SeqList<int> sl2 = new SeqList<int>(6);
10 sl2.Append(2);
11 sl2.Append(5);
12 sl2.Append(6);
13 sl2.Append(8);
14 sl2.Append(11);
15 sl2.Append(14);
16
17 GenericList gl = new GenericList();
18 SeqList<int> sl3 = gl.Merge(sl1, sl2);
19 Console.WriteLine("length:" + sl3.GetLength());
20 for (int i = 0; i < sl3.GetLength(); i++)
21 {
22 Console.WriteLine(i + ":" + sl3[i]);
23 }
24 }

好了,下一次学习链表。