博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#单链表的实现及其应用
阅读量:6291 次
发布时间:2019-06-22

本文共 5417 字,大约阅读时间需要 18 分钟。

ExpandedBlockStart.gif
代码
单链表结点类的实现如下所示。
       
public
 
class
 Node
<
T
>
        {
            
private
 T data; 
//
数据域
            
private
 Node
<
T
>
 next; 
//
引用域
            
//
构造器
            
public
 Node(T val, Node
<
T
>
 p)
            {
                data 
=
 val;
                next 
=
 p;
            }
            
//
构造器
            
public
 Node(Node
<
T
>
 p)
            {
                next 
=
 p;
            }
            
//
构造器
            
public
 Node(T val)
            {
                data 
=
 val;
                next 
=
 
null
;
            }
            
//
构造器
            
public
 Node()
            {
                data 
=
 
default
(T);
                next 
=
 
null
;
            }
            
//
数据域属性
            
public
 T Data
            {
                
get
                {
                    
return
 data;
                }
                
set
                {
                    data 
=
 value;
                }
            }
            
//
引用域属性
            
public
 Node
<
T
>
 Next
            {
                
get
                {
                    
return
 next;
                }
                
set
                {
                    next 
=
 value;
                }
            }
        }
链表操作实现类
public
 
class
 LinkList
<
T
>
 : IListDS
<
T
>
{
        
private
 Node
<
T
>
 head; 
//
单链表的头引用
        
//
头引用属性
        
public
 Node
<
T
>
 Head
        {
            
get
            {
                
return
 head;
            }
            
set
            {
                head 
=
 value;
            }
        }
        
//
构造器
        
public
 LinkList()
        {
            head 
=
 
null
;
        }
        
//
求单链表的长度
        
public
 
int
 GetLength()
        {
            Node
<
T
>
 p 
=
 head;
            
int
 len 
=
 
0
;
            
while
 (p 
!=
 
null
)
            {
                
++
len;
                p 
=
 p.Next;
            }
            
return
 len;
        }
        
//
清空单链表
        
public
 
void
 Clear()
        {
            head 
=
 
null
;
        }
        
//
判断单链表是否为空
        
public
 
bool
 IsEmpty()
        {
            
if
 (head 
==
 
null
)
            {
                
return
 
true
;
            }
            
else
            {
                
return
 
false
;
            }
        }
        
//
在单链表的末尾添加新元素
        
public
 
void
 Append(T item)
        {
            Node
<
T
>
 q 
=
 
new
 Node
<
T
>
(item);
            Node
<
T
>
 p 
=
 
new
 Node
<
T
>
();
            
if
 (head 
==
 
null
)
            {
                head 
=
 q;
                
return
;
            }
            p 
=
 head;
            
while
 (p.Next 
!=
 
null
)
            {
                p 
=
 p.Next;
            }
            p.Next 
=
 q;
        }
        
//
在单链表的第i个结点的位置前插入一个值为item的结点
        
public
 
void
 Insert(T item, 
int
 i)
        {
            
if
 (IsEmpty() 
||
 i 
<
 
1
)
            {
                Console.WriteLine(
"
List is empty or Position is error!
"
);
                
return
;
            }
            
if
 (i 
==
 
1
)
            {
                Node
<
T
>
 q 
=
 
new
 Node
<
T
>
(item);
                q.Next 
=
 head;
                head 
=
 q;
                
return
;
            }
            Node
<
T
>
 p 
=
 head;
            Node
<
T
>
 r 
=
 
new
 Node
<
T
>
();
            
int
 j 
=
 
1
;
            
while
 (p.Next 
!=
 
null
 
&&
 j 
<
 i)
            {
                r 
=
 p;
                p 
=
 p.Next;
                
++
j;
            }
            
if
 (j 
==
 i)
            {
                Node
<
T
>
 q 
=
 
new
 Node
<
T
>
(item);
                q.Next 
=
 p;
                r.Next 
=
 q;
            }
        }
        
//
在单链表的第i个结点的位置后插入一个值为item的结点
        
public
 
void
 InsertPost(T item, 
int
 i)
        {
            
if
 (IsEmpty() 
||
 i 
<
 
1
)
            {
                Console.WriteLine(
"
List is empty or Position is error!
"
);
                
return
;
            }
            
if
 (i 
==
 
1
)
            {
                Node
<
T
>
 q 
=
 
new
 Node
<
T
>
(item);
                q.Next 
=
 head.Next;
                head.Next 
=
 q;
                
return
;
            }
            Node
<
T
>
 p 
=
 head;
            
int
 j 
=
 
1
;
            
while
 (p 
!=
 
null
 
&&
 j 
<
 i)
            {
                p 
=
 p.Next;
                
++
j;
            }
            
if
 (j 
==
 i)
            {
                Node
<
T
>
 q 
=
 
new
 Node
<
T
>
(item);
                q.Next 
=
 p.Next;
                p.Next 
=
 q;
            }
        }
        
//
删除单链表的第i个结点
        
public
 T Delete(
int
 i)
        {
            
if
 (IsEmpty() 
||
 i 
<
 
0
)
            {
                Console.WriteLine(
"
Link is empty or Position is error!
"
);
                
return
 
default
(T);
            }
            Node
<
T
>
 q 
=
 
new
 Node
<
T
>
();
            
if
 (i 
==
 
1
)
            {
                q 
=
 head;
                head 
=
 head.Next;
                
return
 q.Data;
            }
            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(
"
The ith node is not exist!
"
);
                
return
 
default
(T);
            }
        }
        
//
获得单链表的第i个数据元素
        
public
 T GetElem(
int
 i)
        {
            
if
 (IsEmpty())
            {
                Console.WriteLine(
"
List is empty!
"
);
                
return
 
default
(T);
            }
            Node
<
T
>
 p 
=
 
new
 Node
<
T
>
();
            p 
=
 head;
            
int
 j 
=
 
1
;
            
while
 (p.Next 
!=
 
null
 
&&
 j 
<
 i)
            {
                
++
j;
                p 
=
 p.Next;
            }
            
if
 (j 
==
 i)
            {
                
return
 p.Data;
            }
            
else
            {
                Console.WriteLine(
"
The ith node is not exist!
"
);
                
return
 
default
(T);
            }
        }
        
//
在单链表中查找值为value的结点
        
public
 
int
 Locate(T value)
        {
            
if
 (IsEmpty())
            {
                Console.WriteLine(
"
List is Empty!
"
);
                
return
 
-
1
;
            }
            Node
<
T
>
 p 
=
 
new
 Node
<
T
>
();
            p 
=
 head;
            
int
 i 
=
 
1
;
            
while
 (
!
p.Data.Equals(value) 
&&
 p.Next 
!=
 
null
)
            {
                p 
=
 p.Next;
                
++
i;
            }
            
return
 i;
        }
        
public
 
void
 Display()
        {
            Node
<
T
>
 p 
=
 
new
 Node
<
T
>
();
            p 
=
 
this
.head;
            
while
(p
!=
 
null
)
            {
                System.Console.WriteLine(p.Data);
                p 
=
 p.Next;
            }
        }
        
 }
IListDs接口如下:
public
 
interface
 IListDS
<
T
>
{
       
            
int
 GetLength(); 
//
求长度
            
void
 Clear(); 
//
清空操作
            
bool
 IsEmpty(); 
//
判断线性表是否为空
            
void
 Append(T item); 
//
附加操作
            
void
 Insert(T item, 
int
 i); 
//
插入操作
            T Delete(
int
 i); 
//
删除操作
            T GetElem(
int
 i); 
//
取表元
            
int
 Locate(T value); 
//
按值查找
            
//
void Rervese();
       
}
链表的应用
    
public
 
class
 LinkListApplication
    {
       
        
//
在头部插入结点建立单链表的算法如下:
        
public
 
static
 LinkList
<
int
>
 CreateLListHead()
        {
            
int
 d;
            LinkList
<
int
>
 L 
=
 
new
 LinkList
<
int
>
();
            d 
=
 Int32.Parse(Console.ReadLine());
            
while
 (d 
!=
 
-
1
)
            {
                Node
<
int
>
 p 
=
 
new
 Node
<
int
>
(d);
                p.Next 
=
 L.Head;
                L.Head 
=
 p;
                d 
=
 Int32.Parse(Console.ReadLine());
            }
            
return
 L;
        }
        
//
在尾部插入结点建立单链表的算法如下:
        
public
 
static
 LinkList
<
int
>
 CreateListTail()
        {
            Node
<
int
>
 R 
=
 
new
 Node
<
int
>
();
            
int
 d;
            LinkList
<
int
>
 L 
=
 
new
 LinkList
<
int
>
();
            R 
=
 L.Head;
            d 
=
 Int32.Parse(Console.ReadLine());
            
while
 (d 
!=
 
-
1
)
            {
                Node
<
int
>
 p 
=
 
new
 Node
<
int
>
(d);
                
if
 (L.Head 
==
 
null
)
                {
                    L.Head 
=
 p;
                }
                
else
                {
                    R.Next 
=
 p;
                }
                R 
=
 p;
                d 
=
 Int32.Parse(Console.ReadLine());
            }
            
if
 (R 
!=
 
null
)
            {
                R.Next 
=
 
null
;
            }
            
return
 L;
        }
       
//
将两表合并成一表的算法实现如下:
        
public
 LinkList
<
int
>
 Merge(LinkList
<
int
>
 Ha, LinkList
<
int
>
 Hb)
        {
            LinkList
<
int
>
 Hc 
=
 
new
 LinkList
<
int
>
();
            Node
<
int
>
 s 
=
new
 Node
<
int
>
();
            Node
<
int
>
 p 
=
 Ha.Head.Next;
            Node
<
int
>
 q 
=
 Hb.Head.Next;
            Hc 
=
 Ha;
            Hc.Head.Next
=
 
null
;
            
while
 (p 
!=
 
null
 
&&
 q 
!=
 
null
)
            {
                
if
 (p.Data 
<
 q.Data)
                {
                    s 
=
 p;
                    p 
=
 p.Next;
                }
                
else
                {
                    s 
=
 q;
                    q 
=
 q.Next;
                }
                Hc.Append(s.Data);
            }
            
if
 (p 
==
 
null
)
            {
                p 
=
 q;
            }
            
while
 (p 
!=
 
null
)
            {
                s 
=
 p;
                p 
=
 p.Next;
                Hc.Append(s.Data);
            }
            
return
 Hc;
        }
        
//
删除单链表中相同值的结点的算法实现如下:
        
public
 LinkList
<
int
>
 Purge(LinkList
<
int
>
 Ha)
        {
            LinkList
<
int
>
 Hb 
=
 
new
 LinkList
<
int
>
();
            Node
<
int
>
 p 
=
 Ha.Head.Next;
            Node
<
int
>
 q 
=
 
new
 Node
<
int
>
();
            Node
<
int
>
 s 
=
 
new
 Node
<
int
>
();
            s 
=
 p;
            p 
=
 p.Next;
            s.Next 
=
 
null
;
            Hb.Head.Next 
=
 s;
            
while
 (p 
!=
 
null
)
            {
                s 
=
 p;
                p 
=
 p.Next;
                q 
=
 Hb.Head.Next;
                
while
 (q 
!=
 
null
 
&&
 q.Data 
!=
 s.Data)
                {
                    q 
=
 q.Next;
                }
                
if
 (q 
==
 
null
)
                {
                    s.Next 
=
 Hb.Head.Next;
                    Hb.Head .Next 
=
 s;
                }
            }
            
return
 Hb;
        }
    }

 

转载于:https://www.cnblogs.com/hubcarl/archive/2010/04/07/1706365.html

你可能感兴趣的文章