潜心学习数据结构-C#语言描述(一:线性表,顺序表)
2009-02-23 22:26 宝宝合凤凰 阅读(455) 评论(0) 编辑 收藏 举报这几天找工作,大公司基本上都是要求基础和素质好的,这让我很郁闷,让我单独的去找外包公司,我又不肯,因为没什么发展前景,被打击的不行,所以还是回家来潜心学习一下数据结构等基础知识,然后再冲击好公司。。其实说找不到工作是不可能的,还是朋友说的一句话对找好工作难”。。
既然这样,就只好花几个月的时间从头开始稳固稳固一下数据结构的基本知识,巩固时,也做一做笔记,让自己也让大家能获益。。
数据结构中最基础也最常用的就是线性表了,线性表是最简单也最常用的,很多排序的概念都是从线性表中来的,线性表的结构主要如下。
从上图就可以看出,线性表其实是非常基础的,线性表可以看做是一个数组,在线性表中,可以对表中的数据进行插入、更新和删除等操作。其中last是一个指针变量(在C++中使用,在C#中可作为标识),用于指向该当前所指的元素,而data是数据的内容,用于存放数据,在C#中,可以通过数组的Length方法遍历进行数据的访问。
在了解了基本的顺序表的结构,就可以在C#中创建一个SeqList对象,示例代码如下所示。
{
const int max = 10;
public int[] data = new int[max]; //创建表
public int last; //作为标识
public void CreateSqList() //创建表的方法
{
this.last = -1;
}
}
创建完成后这里创建一个窗体,如下图
这里前面选择插入的位置,后面选择需要插入的值,当单击Insert按钮时在相应的位置插入数据,当单击”Delete按钮时删除相应位置的数据,窗体初始化代码如下所示。
public SqList list = new SqList();
private void Form1_Load(object sender, EventArgs e)
{
list.CreateSqList();
//增加10个项
for (int i = 0; i < 10; i++)
{
list.data[i] = i;
list.last++;
}
textBox2.Text="";
for (int i = 0; i < list.data.Length; i++)
{
textBox2.Text += list.data[i].ToString()+Environment.NewLine;
comboBox1.Items.Add(i.ToString());
}
comboBox1.Text=(1).ToString();
textBox1.Text = (100).ToString();
}
上述代码在窗体初始化时初始化了一些项目并创建了一个顺序表,当用户单击”Insert按钮时,可以在相应的位置进行插入操作,数据的插入前,首先需要找到是否有这个位置,如果存在这个位置,则允许插入,否则不允许插入,查找代码如下所示。
private bool Find(int p)
{
if (p < 0 || p > list.data.Length)
{
return false;
}
else
{
return true;
}
}
如果插入的位置小于0并大于表的长度时,就返回false表示插入失败,顺序表插入代码如下所示。
private void button1_Click(object sender, EventArgs e)
{
if (comboBox1.Text.Length < 0 || textBox1.Text.Length < 0)
{
label2.Text = "Error,Please choose a Place to Insert";
}
else
{
label2.Text = "";
int place = 1;
int num=0;
try
{
place = Convert.ToInt32(comboBox1.Text);
num = Convert.ToInt32(textBox1.Text);
if (Find(place)) //查看是否插入正确
{
Insert(place,num); //执行插入方法
textBox2.Text = ""; //清空项并重新显式
comboBox1.Items.Clear();
for (int i = 0; i < list.data.Length; i++)
{
textBox2.Text += list.data[i].ToString() + Environment.NewLine;
comboBox1.Items.Add((i + 1).ToString());
}
}
else
{
label2.Text = "You Can't find this place";
}
}
catch
{
label2.Text = "You have to insert a number(INT)";
}
}
}
在插入方法中,需要使用Insert方法,Insert方法包括两个参数,一个是需要插入的值,另一个是插入的位置,Insert方法实现如下。
private void Insert(int p,int d)
{
for (int i = list.data.Length - 1; i >= p; i--)
{
list.data[i] = list.data[i - 1];
list.last++;
}
list.data[p] = d;
}
在数据插入时,首先要移动该位置的后面的所有项,并向后移动一位,然后在该位置存储需要插入的值。在删除方法中,需要使用Delete方法,Delete方法只有一个参数,这个参数就是删除数据的位置,在数据删除时,不是真正的删除数据,而是将后面的数组的值移动到前面进行覆盖操作,示例代码如下所示。
private void Delete(int p)
{
for (int i = p; i < list.data.Length - 1; i++)
{
list.data[i] = list.data[i + 1];
list.last--;
}
list.data[list.data.Length-1] = 0;
}
上述代码就执行了相应的删除操作,在顺序表中,最主要的操作就是插入和删除操作,其实现起来也并不难,该应用程序运行后如下所示。
这里选择在第5个位置进行数据插入,插入后100被插入到第5个位置,所有的其他数据将会依次往后排列,超出的数据被丢弃
在单击删除时,这里删除了第5个位置的数据,删除了100,其位置后面的所有的数据都会向前移动一个位置,对于超出的数据而言,其数据会被0填充。