Chinaunix首页 | 论坛 | 博客
  • 博客访问: 610548
  • 博文数量: 262
  • 博客积分: 8433
  • 博客等级: 中将
  • 技术积分: 2141
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-31 09:37
文章分类

全部博文(262)

文章存档

2012年(1)

2011年(168)

2010年(92)

2009年(1)

分类: C/C++

2011-01-26 10:27:10

  1. /*
  2.  *单链表的操作
  3.  */
  4. #include <stdio.h>
  5. #include <stdlib.h>

  6. #define OK 0
  7. #define ERROR -1

  8. typedef int ElemType;
  9. typedef int Status;

  10. typedef struct ListNode{
  11.     ElemType data;
  12.     ListNode* next;
  13. }ListNode;

  14. //创建一个空链表

  15. Status ListCreat(ListNode* L)
  16. {
  17. //    ListNode* L;

  18.     L = (ListNode*)malloc(sizeof(ListNode));
  19.     if(!L)
  20.     {
  21.         printf("L malloc err! \n");
  22.         return ERROR;
  23.     }
  24.     L->next = NULL;

  25.     return OK;
  26. }

  27. Status ListDestroy(ListNode* L)
  28. {
  29.     free(L);
  30.     return OK;
  31. }

  32. Status ListInsert(ListNode* L,ElemType e)
  33. {
  34.     ListNode *T;    //始终指向尾节点


  35.     T = L;            //首先定位首节点

  36.     //查找尾节点

  37.     while(T->next!=NULL)    
  38.     {
  39.         T = T->next;
  40.     }

  41.     //找到了尾节点,创建新节点

  42.     ListNode *N;    //新节点

  43.     N = (ListNode*)malloc(sizeof(ListNode));
  44.     if(!N)
  45.     {
  46.         printf("malloc err! \n");
  47.         return ERROR;
  48.     }
  49.     N->data = e;
  50.     T->next = N;
  51.     N ->next = NULL;    //指向尾节点


  52.     return OK;
  53. }

  54. void main()
  55. {
  56.     //建立单链表

  57.     ListNode L;
  58.     if(ListCreat(&L))    //由于我们要重新分配内存,所以我们要用地址的方式&来传递地址,即**!修改后的源码见后面
  59.         printf("ListCreat Err! \n");
  60.     printf("L addr is %p \n",L);

  61.     //插入元素

  62.     printf("请输入要插入的链表元素,ctrl+z结束:\n");
  63.     ElemType e;
  64.     while(scanf("%d",&e) != EOF)    //

  65.     {
  66.         printf("data is %d \n",e);    //像此类情况,我们必须用&,而不能用指针,因为用指针之前必须分配空间

  67.         ListInsert(&L,e);
  68.     }

  69.     //打印每个元素

  70.     ListNode *A;
  71.     A = &L;
  72.     while(A->next)
  73.     {
  74.         printf("data is %d \n",A->data);
  75.         A = A->next;
  76.     }
  77.     
  78. }

错误信息:

  1. List.exe 中的 0x00d73617 处未处理的异常: 0xC0000005: 读取位置 0xccccccd0 时发生访问冲突

修改后的源码:

 

  1. /*

  2.  *单链表的操作

  3.  */

  4. #include <stdio.h>

  5. #include <stdlib.h>



  6. #define OK 0

  7. #define ERROR -1



  8. typedef int ElemType;

  9. typedef int Status;



  10. typedef struct ListNode{

  11.     ElemType data;

  12.     ListNode* next;

  13. }ListNode;



  14. //创建一个空链表




  15. Status ListCreat(ListNode** L)

  16. {

  17. // ListNode* L;




  18.     *L = (ListNode*)malloc(sizeof(ListNode));

  19.     if(!*L)

  20.     {

  21.         printf("L malloc err! \n");

  22.         return ERROR;

  23.     }

  24.     (*L)->next = NULL;



  25.     return OK;

  26. }






  27. Status ListInsert(ListNode* L,ElemType e)

  28. {

  29.     ListNode *T; //始终指向尾节点






  30.     T = L; //首先定位首节点




  31.     //查找尾节点




  32.     while(T->next!=NULL) //下一块内存T->next为空,那我们又如何操作呢?所以说报错了




  33.     {

  34.         T = T->next;

  35.     }



  36.     //找到了尾节点,创建新节点




  37.     ListNode *N; //新节点




  38.     N = (ListNode*)malloc(sizeof(ListNode));

  39.     if(!N)

  40.     {

  41.         printf("malloc err! \n");

  42.         return ERROR;

  43.     }

  44.     N->data = e;

  45.     T->next = N;

  46.     N ->next = NULL; //指向尾节点






  47.     return OK;

  48. }



  49. void main()

  50. {

  51.     //建立单链表




  52.     ListNode *L;

  53.     if(ListCreat(&L)) //




  54.         printf("ListCreat Err! \n");

  55.     printf("L addr is %p \n",L);



  56.     //插入元素




  57.     printf("请输入要插入的链表元素,ctrl+z结束:\n");

  58.     ElemType e;

  59.     while(scanf("%d",&e) != EOF) //




  60.     {

  61.         printf("data is %d \n",e); //像此类情况,我们必须用&,而不能用指针,因为用指针之前必须分配空间




  62.         ListInsert(L,e);

  63.     }



  64.     //打印每个元素




  65.     ListNode *A;

  66.     A = L;

  67.     while(A->next)

  68.     {

  69.         A = A->next;
  70.         printf("data is %d \n",A->data);


  71.     }

  72.     

  73. }

 

 

阅读(972) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~