那位大虾能详尽展示C#指针的用法——实现链表? 不胜感激!
如题。
另外,我总是引用不了对象中的指针。编译时总是提示指针前不能用"."运算符。(大致是这样的提示)
请教过来人指点!!
谢谢!
问题点数:0、回复次数:3Top
1 楼Ninputer(装配脑袋)回复于 2005-06-02 18:04:08 得分 0
在c#中只有值类型才能使用指针,这使得指针的使用非常受限制。你可以用引用代替指针,实现链表非常方便。Top
2 楼pH13lj()回复于 2005-06-03 09:23:17 得分 0
给个代码示例好吗?
谢谢!Top
3 楼mathsword(梦在流浪)回复于 2005-06-03 09:35:40 得分 0
用C#实现数据结构(2) - 链表(不带头结点)
using System;
namespace CS数据结构
{
/**//// <summary>
/// 结点类
/// 为方便起见,结点数据类型用int表示
/// </summary>
public class ListNode
{
public int data; //ElemType
public ListNode()
{
}
public ListNode next;
}
/**//// <summary>
/// 链表类
/// </summary>
public class LinkList
{
private ListNode first; //第一个结点
public LinkList()
{
first = null;
}
public bool IsEmpty()
{
return first == null;
}
public int Length()
{
ListNode current = first;
int length = 0;
while(current != null)
{
length++;
current = current.next;
}
return length;
}
/**//// <summary>
/// 返回第k个元素至x中
/// </summary>
/// <param name="k"></param>
/// <param name="x"></param>
/// <returns>如果不存在第k个元素则返回false,否则返回true</returns>
public bool Find( int k, ref int x )
{
if( k<1 )
return false;
ListNode current = first;
int index = 1;
while( index<k && current != null )
{
current = current.next;
index++;
}
if( current != null )
{
x = current.data;
return true;
}
return false;
}
/**//// <summary>
/// 返回x所在的位置
/// </summary>
/// <param name="x"></param>
/// <returns>如果x不在表中则返回0</returns>
public int Search( int x )
{
ListNode current = first;
int index = 1;
while( current != null && current.data !=x )
{
current = current.next;
index++;
}
if(current != null)
return index;
return 0;
}
/**//// <summary>
/// 删除第k个元素,并用x返回其值
/// </summary>
/// <param name="k"></param>
/// <param name="x"></param>
/// <returns></returns>
public LinkList Delete( int k, ref int x )
{
//如果不存在第k个元素则引发异常
if( k<1 || first == null )
throw( new OutOfBoundsException() );
ListNode pNode = first; //pNode将最终指向第k个结点
//将pNode移动至第k个元素,并从链表中删除该元素
if( k == 1 ) //pNode已经指向第k个元素
first = first.next; //删除之
else
{
//用qNode指向第k-1个元素
ListNode qNode = first;
for( int index=1; index< k-1 && qNode != null; index++ )
qNode = qNode.next;
if( qNode == null || qNode.next == null )
throw( new OutOfBoundsException() );//不存在第k个元素
pNode = qNode.next; //pNode指向第k个元素
qNode.next = pNode.next; //从链表中删除第k个元素
x = pNode.data;
}
return this;
}
/**//// <summary>
/// 在第k个元素之后插入x
/// </summary>
/// <param name="k"></param>
/// <param name="x"></param>
/// <returns></returns>
public LinkList Insert( int k, int x )
{
//如果不存在第k个元素,则引发异常OutOfBoundsException
if( k<0 )
throw( new OutOfBoundsException() );
ListNode pNode = first; //pNode将最终指向第k个结点
for( int index = 1; index<k && pNode != null; index++ )
pNode = pNode.next;
if( k>0 && pNode == null )
throw( new OutOfBoundsException() );//不存在第k个元素
ListNode xNode = new ListNode();
xNode.data = x;
if( k>0 )
{
//在pNode之后插入
xNode.next = pNode.next;
pNode.next = xNode;
}
else
{
//作为第一个元素插入
xNode.next = first;
first = xNode;
}
return this;
}
public void Clear()
{
first = null;
}
public void OutPut()
{
ListNode current;
for( current = first; current != null; current = current.next )
{
Console.Write("{0}", current.data.ToString() );
}
Console.WriteLine();
}
}
}Top




