C版的链表先要了解动态内存分配函数malloc的使用,使用结构表示节点单元。
代码如下:
C#使用类代替结构进行节点表示,改写如下:
不过这个版本(包括C和C#代码)的链表创建有一些问题,你看出来了吗?
本来应该分配6个节点,可上面的代码却分配了7个节点,产生这种错误的原因是因为没有独立处理第一个节点。链表中的第一个节点是链表操作的特例,需要独立处理。
改改以后的代码如下:
C版本 :
C#版本:
参考资料:《数据结构C语言版》
wssmax的blog文章:c#数据结构研究———链表1
PS:我不是很清楚.NET中写数据结构的方式,以上C#代码只是纯粹按部就班改写C代码,如果有更好的方式,欢迎大家提醒,谢谢!
代码如下:
1
#include<stdio.h>
2![](/Images/OutliningIndicators/None.gif)
3
struct llist
4
{
5
int num;
6
char name[10];
7
struct llist *next;
8
};
9
typedef struct llist node;
10
typedef node *llink;
11![](/Images/OutliningIndicators/None.gif)
12
void main()
13
{
14
llink head;
15
llink ptr;
16
int i;
17
18
head = (llink)malloc(sizeof(node));
19
if(!head)
20
{
21
printf("内存分配失败!\n");
22
exit(1);
23
}
24
25
head->next = NULL;
26
ptr = head;
27
printf("请输入六项邮寄数据:\n");
28
for(i = 0;i < 6; i++)
29
{
30
printf("请输入编号 ==> ");
31
scanf("%d",&ptr->num);
32
printf("请输入编号(%d)的姓名 ==> ",ptr->num);
33
scanf("%s",ptr->name);
34
ptr->next = (llink)malloc(sizeof(node));
35
if(!ptr->next)
36
{
37
printf("内存分配失败!\n");
38
exit(1);
39
}
40
ptr->next->next = NULL;
41
ptr = ptr->next;
42
}
43
printf("邮寄数据:\n");
44
ptr = head;
45
for(i = 0;i < 6;i++)
46
{
47
printf("编号:%d\n",ptr->num);
48
printf(" 姓名 : %s\n",ptr->name);
49
ptr = ptr->next;
50
}
51
}
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
47
![](/Images/OutliningIndicators/InBlock.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/InBlock.gif)
50
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
51
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
C#使用类代替结构进行节点表示,改写如下:
1
using System;
2![](/Images/OutliningIndicators/None.gif)
3
class Node
4
{
5
private int num;
6
7
public int Num
8
{
9
set{num = value;}
10
get{return num;}
11
}
12
13
private string name;
14
15
public string Name
16
{
17
set{name = value;}
18
get{return name;}
19
}
20
21
private Node next;
22
23
public Node Next
24
{
25
set{next = value;}
26
get{return next;}
27
}
28
}
29![](/Images/OutliningIndicators/None.gif)
30
class Test
31
{
32
public static void Main()
33
{
34
Node head;
35
Node tempNode;
36
int i;
37
38
head = new Node();
39
head.Next = null;
40
tempNode = head;
41
Console.WriteLine("请输入六项邮寄数据:");
42
for( i = 0 ;i < 6; i++)
43
{
44
Console.WriteLine("请输入编号 ==>");
45
tempNode.Num = Convert.ToInt32(Console.ReadLine());
46
Console.WriteLine("请输入编号({0})的姓名",tempNode.Num);
47
tempNode.Name = Console.ReadLine();
48
tempNode.Next = new Node();
49
tempNode.Next.Next = null;
50
tempNode = tempNode.Next;
51
}
52
Console.WriteLine("邮寄数据:");
53
tempNode = head;
54
for( i = 0; i < 6; i++)
55
{
56
Console.WriteLine("编号:{0}",tempNode.Num);
57
Console.WriteLine("姓名:{0}",tempNode.Name);
58
tempNode = tempNode.Next;
59
}
60
}
61
}
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
9
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
10
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
11
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
17
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
18
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
19
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
25
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
26
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
27
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
28
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
29
![](/Images/OutliningIndicators/None.gif)
30
![](/Images/OutliningIndicators/None.gif)
31
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/InBlock.gif)
47
![](/Images/OutliningIndicators/InBlock.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/InBlock.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/InBlock.gif)
58
![](/Images/OutliningIndicators/InBlock.gif)
59
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
60
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
61
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
不过这个版本(包括C和C#代码)的链表创建有一些问题,你看出来了吗?
本来应该分配6个节点,可上面的代码却分配了7个节点,产生这种错误的原因是因为没有独立处理第一个节点。链表中的第一个节点是链表操作的特例,需要独立处理。
改改以后的代码如下:
C版本 :
1
#include<stdio.h>
2![](/Images/OutliningIndicators/None.gif)
3
struct llist
4
{
5
int num;
6
char name[10];
7
struct llist *next;
8
};
9
typedef struct llist node;
10
typedef node *llink;
11![](/Images/OutliningIndicators/None.gif)
12
void main()
13
{
14
llink head;
15
llink ptr,ptr1;
16
int i;
17
18
head = (llink)malloc(sizeof(node)); //分配第一个节点
19
if(!head)
20
{
21
printf("内存分配失败!\n");
22
exit(1);
23
}
24
25
printf("请输入六项邮寄数据:\n");
26
printf("请输入编号 ==> ");
27
scanf("%d",&head->num);
28
printf("请输入编号(%d)的姓名 ==> ",head->num);
29
scanf("%s",head->name);
30
head->next = NULL;
31
ptr = head;
32
for(i = 1;i < 6; i++)
33
{
34
ptr1 = (llink)malloc(sizeof(node));
35
if(!ptr1)
36
{
37
printf("内存分配失败!\n");
38
exit(1);
39
}
40
printf("请输入编号 ==> ");
41
scanf("%d",&ptr1->num);
42
printf("请输入编号(%d)的姓名 ==> ",ptr1->num);
43
scanf("%s",ptr1->name);
44
ptr1->next = NULL;
45
ptr -> next = ptr1;
46
ptr = ptr ->next;
47
}
48
printf("邮寄数据:\n");
49
ptr = head;
50
for(i = 0;i < 6;i++)
51
{
52
printf("编号:%d\n",ptr->num);
53
printf(" 姓名 : %s\n",ptr->name);
54
ptr = ptr->next;
55
}
56
}
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/InBlock.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/InBlock.gif)
47
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/InBlock.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
56
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
1
using System;
2![](/Images/OutliningIndicators/None.gif)
3
class Node
4
{
5
private int num;
6
7
public int Num
8
{
9
set{num = value;}
10
get{return num;}
11
}
12
13
private string name;
14
15
public string Name
16
{
17
set{name = value;}
18
get{return name;}
19
}
20
21
private Node next;
22
23
public Node Next
24
{
25
set{next = value;}
26
get{return next;}
27
}
28
}
29![](/Images/OutliningIndicators/None.gif)
30
class Test
31
{
32
public static void Main()
33
{
34
Node head;
35
Node tempNode,tempNode1;
36
int i;
37
38
head = new Node();
39
Console.WriteLine("请输入六项邮寄数据:\n");
40
Console.WriteLine("请输入编号==>");
41
head.Num = Convert.ToInt32(Console.ReadLine());
42
Console.WriteLine("请输入编号({0})的姓名 ==>",head.Num);
43
head.Name = Console.ReadLine();
44
head.Next = null;
45
tempNode = head;
46
for( i = 1 ;i < 6; i++)
47
{
48
tempNode1 = new Node();
49
Console.WriteLine("请输入编号 ==>");
50
tempNode1.Num = Convert.ToInt32(Console.ReadLine());
51
Console.WriteLine("请输入编号({0})的姓名",tempNode1.Num);
52
tempNode1.Name = Console.ReadLine();
53
tempNode1.Next = null;
54
tempNode.Next = tempNode1;
55
tempNode = tempNode.Next;
56
}
57
Console.WriteLine("邮寄数据:");
58
tempNode = head;
59
for( i = 0; i < 6; i++)
60
{
61
Console.WriteLine("编号:{0}",tempNode.Num);
62
Console.WriteLine("姓名:{0}",tempNode.Name);
63
tempNode = tempNode.Next;
64
}
65
}
66
}
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
9
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
10
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
11
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
17
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
18
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
19
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
25
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
26
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
27
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
28
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
29
![](/Images/OutliningIndicators/None.gif)
30
![](/Images/OutliningIndicators/None.gif)
31
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/InBlock.gif)
47
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/InBlock.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/InBlock.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/InBlock.gif)
56
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
57
![](/Images/OutliningIndicators/InBlock.gif)
58
![](/Images/OutliningIndicators/InBlock.gif)
59
![](/Images/OutliningIndicators/InBlock.gif)
60
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
61
![](/Images/OutliningIndicators/InBlock.gif)
62
![](/Images/OutliningIndicators/InBlock.gif)
63
![](/Images/OutliningIndicators/InBlock.gif)
64
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
65
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
66
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
参考资料:《数据结构C语言版》
wssmax的blog文章:c#数据结构研究———链表1
PS:我不是很清楚.NET中写数据结构的方式,以上C#代码只是纯粹按部就班改写C代码,如果有更好的方式,欢迎大家提醒,谢谢!