C版的链表先要了解动态内存分配函数malloc的使用,使用结构表示节点单元。
代码如下:
C#使用类代替结构进行节点表示,改写如下:
不过这个版本(包括C和C#代码)的链表创建有一些问题,你看出来了吗?
本来应该分配6个节点,可上面的代码却分配了7个节点,产生这种错误的原因是因为没有独立处理第一个节点。链表中的第一个节点是链表操作的特例,需要独立处理。
改改以后的代码如下:
C版本 :
C#版本:
参考资料:《数据结构C语言版》
wssmax的blog文章:c#数据结构研究———链表1
PS:我不是很清楚.NET中写数据结构的方式,以上C#代码只是纯粹按部就班改写C代码,如果有更好的方式,欢迎大家提醒,谢谢!
代码如下:
1#include<stdio.h>
2
3struct llist
4{
5 int num;
6 char name[10];
7 struct llist *next;
8};
9typedef struct llist node;
10typedef node *llink;
11
12void 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}
2
3struct llist
4{
5 int num;
6 char name[10];
7 struct llist *next;
8};
9typedef struct llist node;
10typedef node *llink;
11
12void 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}
C#使用类代替结构进行节点表示,改写如下:
1using System;
2
3class 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
30class 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}
2
3class 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
30class 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}
不过这个版本(包括C和C#代码)的链表创建有一些问题,你看出来了吗?
本来应该分配6个节点,可上面的代码却分配了7个节点,产生这种错误的原因是因为没有独立处理第一个节点。链表中的第一个节点是链表操作的特例,需要独立处理。
改改以后的代码如下:
C版本 :
1#include<stdio.h>
2
3struct llist
4{
5 int num;
6 char name[10];
7 struct llist *next;
8};
9typedef struct llist node;
10typedef node *llink;
11
12void 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}
2
3struct llist
4{
5 int num;
6 char name[10];
7 struct llist *next;
8};
9typedef struct llist node;
10typedef node *llink;
11
12void 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}
1using System;
2
3class 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
30class 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}
2
3class 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
30class 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}
参考资料:《数据结构C语言版》
wssmax的blog文章:c#数据结构研究———链表1
PS:我不是很清楚.NET中写数据结构的方式,以上C#代码只是纯粹按部就班改写C代码,如果有更好的方式,欢迎大家提醒,谢谢!