代码改变世界

潜心学习数据结构-C#语言描述(一:线性表,顺序表)

2009-02-23 22:26  宝宝合凤凰  阅读(455)  评论(0编辑  收藏  举报

这几天找工作,大公司基本上都是要求基础和素质好的,这让我很郁闷,让我单独的去找外包公司,我又不肯,因为没什么发展前景,被打击的不行,所以还是回家来潜心学习一下数据结构等基础知识,然后再冲击好公司。。其实说找不到工作是不可能的,还是朋友说的一句话对找好工作难”。。

既然这样,就只好花几个月的时间从头开始稳固稳固一下数据结构的基本知识,巩固时,也做一做笔记,让自己也让大家能获益。。

数据结构中最基础也最常用的就是线性表了,线性表是最简单也最常用的,很多排序的概念都是从线性表中来的,线性表的结构主要如下。

从上图就可以看出,线性表其实是非常基础的,线性表可以看做是一个数组,在线性表中,可以对表中的数据进行插入、更新和删除等操作。其中last是一个指针变量(在C++中使用,在C#中可作为标识),用于指向该当前所指的元素,而data是数据的内容,用于存放数据,在C#中,可以通过数组的Length方法遍历进行数据的访问。

在了解了基本的顺序表的结构,就可以在C#中创建一个SeqList对象,示例代码如下所示。

public class SqList    
{    
    
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填充。