小新的技术天地

Make It Works !

博客园 首页 新随笔 联系 订阅 管理
C版的链表先要了解动态内存分配函数malloc的使用,使用结构表示节点单元。
代码如下:
 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}

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}

不过这个版本(包括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}
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,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代码,如果有更好的方式,欢迎大家提醒,谢谢!
posted on 2005-05-12 22:18  小新0574  阅读(2811)  评论(8编辑  收藏  举报