level 7
实验1 线性表顺序存储结构实现
3.1实验目的和要求
掌握线性表的结构性质及其链式存储结构各种操作的实现;
3.2实验内容
用C#编程实现线性表的链式存储结构及各种操作,尤其要实现任意位置元素的插入和删除操作。
3.3实验指导
1、建立控制台应用程序,创建结点类Node<T>和链式顺序表类SepLinkedList<T>,结点类Node<T>包括两个字段成员_data和_next,分别表示该结点的结点元素和下一结点;包括两个属性成员Data和Next,分别完成对_data和_next读写;3个构造函数 Node()、Node(T data)、Node(Node<T> next),分别表示创建无参数的对象、参数为T类型数据的对象、参数为Node<T>类型结点的对象。链式顺序表类SepLinkedList<T>包括1个私有字段成员_head-头指针;包括1个属性成员Head,完成对_head读写;包括一系列操作方法成员;
2、在主入口函数中创建类的实例,对该实例完成各种操作,每次操作完结果进行输出。
3.4部分程序参考代码
结点类
Public class Node<T>
{
private T _data;
public T Data
{
get { return _data;
}
set { _data
= value; }
}
private Node<T>
_next;
public Node<T>
Next
{
get { return _next;
}
set { _next
= value; }
}
public Node()
{
_data = default(T);
_next = null;
}
public Node(T
data)
{
_data = data;
_next = null;
}
public Node(Node<T>
next)
{
_next = next;
}
}
单链表类
Public class SepLinkedList<T>
{
private Node<T> _head;
/// 头指针
public Node<T>
Head
{
get { return _head;
}
set { _head
= value; }
}
/// 获取单链表长度
public int GetLength()
{
Node<T> p = _head;
int length
= 0;
while (p !=
null)
{
length++;
p = p.Next;
}
return length;
}
/// 清空单链表
public void Clear()
{
_head = null;
}
判断链表是否为空
public bool IsEmpty()
{
if (_head == null)
{
return true;
}
else
{
return false;
}
}
/// 链表末尾追加数据元素
public void
Append(T item)
{
Node<T> p = new
2012年11月01日 09点11分
1
level 7
Node<T>();
Node<T> q = new
Node<T>(item);
if
(_head == null)
{
_head = q;
return;
}
p = _head;
while (p.Next != null)
{
p = p.Next;
}
p.Next = q;
}
/// 删除第i个数据元素
public T
Delete(int i)
{
该部分代码自己实现
}
Node<T> p = _head;
int j = 1;
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("该位置不存在结点");
return default(T);
}
}
/// 在第i个位置前插入数据元素
public void
Insert(T item, int i)
{
该部分代码自己实现
}
/// 读取第i位置元素
public T
GetElem(int i)
{
if
(IsEmpty())
{
Console.WriteLine("链表为空");
return default(T);
}
Node<T> p = new
Node<T>();
p = _head;
int j = 1;
while
(p.Next != null && j < i)
{
p = p.Next;
j++;
}
if (j
== i)
{
return p.Data;
}
else
{
Console.WriteLine("未找到该序号的结点");
return default(T);
}
}
/// 按值查找数据元素
public int
Locate(T item)
{
if
(IsEmpty())
{
Console.WriteLine("链表为空");
return -1;
}
Node<T> p = new
Node<T>();
p = _head;
int i = 1;
while ( p
!= null && !item.Equals(p.Data))
{
p = p.Next;
i++;
}
if (p
!= null)
{
return i;
2012年11月01日 09点11分
2
level 7
}
else
{
Console.WriteLine("单链表中不存在指定数据元素");
return -1;
}
}
}
2.2.3 单链表的建立:
第一种方式:(采用从尾部加入结点的方式)
/// 建立单链表
static
SepLinkedList<int> CreateLinkedList()
{
SepLinkedList<int>
result = new SepLinkedList<int>();
Node<int>
r = new Node<int>();
r = result.Head;
int elem
= Int32.Parse(Console.ReadLine());
while
(elem != -1)//以-1做为结束标志
{
Node<int>
p = new Node<int>(elem);
if
(result.Head == null)
{
result.Head = p;
}
else
{
r.Next = p;//加入链表
}
r = p; //记下最后一个结点
elem =
Int32.Parse(Console.ReadLine());
}
if (r != null)
{
r.Next = null;//最后一个节点地址域置空
}
return
result;
}
第二种方式:(采用在头部加入结点的方式)
static
SepLinkedList<int> CreateSepLinkedList()
{
SepLinkedList<int>
result = new SepLinkedList<int>();
int d =
Int32.Parse(Console.ReadLine());
while (d
!= -1)
{
Node<int>
elem = new Node<int>(d);
elem.Next = result.Head;
result.Head = elem;
d =
Int32.Parse(Console.ReadLine());
}
return
result;
}
2012年11月01日 09点11分
3