黑马程序员技术交流社区

标题: 关于链表问题 [打印本页]

作者: cjfire    时间: 2014-9-23 10:05
标题: 关于链表问题
我程序这样写,为什么会报错?56,57行
  1. //
  2. //  main.c
  3. //  LinkList
  4. //
  5. //  Created by 池颉 on 14-9-21.
  6. //  Copyright (c) 2014年 池颉. All rights reserved.
  7. //

  8. #include <stdio.h>

  9. #define OK 1
  10. #define ERROR 0
  11. #define TRUE 1
  12. #define FALSE 0

  13. typedef int Status;
  14. typedef int ElemType;
  15. typedef struct Node{
  16.     ElemType data;
  17.     struct Node *next;
  18. }Node;

  19. typedef struct Node* LinkList;

  20. /*输出所有元素*/
  21. void PrintfAllElem(LinkList L){
  22.     Node *p = L->next;
  23.     int i = 0;
  24.     while (p) {
  25.         printf("index is %d,data is %d\n",i,p->data);
  26.         p=p->next;
  27.         ++i;
  28.     }
  29. }

  30. /*单链表的读取*/
  31. Status GetElem(LinkList L,int i,ElemType* e){
  32.     Node* p = L->next;
  33.     int j = 1;
  34.    
  35.     while (j<i && p) {
  36.         p = p->next;
  37.         j++;
  38.     }
  39.    
  40.     if (!p || j > i)
  41.         return ERROR;
  42.     *e = p->data;
  43.     return OK;
  44. }

  45. int main(int argc, const char * argv[]) {
  46.    
  47.     LinkList *l = malloc(sizeof(LinkList));
  48.     Node *n = malloc(sizeof(Node));
  49.     l->next = n;
  50.     l->data = 0;
  51.    
  52.     Node *p = (Node*)l;
  53.     p->next = n;
  54.    
  55.     PrintfAllElem(l);
  56.    
  57.     return 0;
  58. }
复制代码

作者: x65396731    时间: 2014-9-23 10:39
有没有可能是因为结构体没有初始化?
作者: housq    时间: 2014-9-23 10:54
l的数据类型是LinkList的指针,不过你的LinkList已经typedef为Node的指针了,你在声明l的时候又用LinkList* ,我不知道是不是指针的指针,不过肯定的是l不是Node类型,他是没有data和next类型的。
作者: 邢玉池    时间: 2014-9-23 11:04
好厉害,我现在还在装黑苹果呢。。。
作者: cjfire    时间: 2014-9-23 11:41
housq 发表于 2014-9-23 10:54
l的数据类型是LinkList的指针,不过你的LinkList已经typedef为Node的指针了,你在声明l的时候又用LinkList* ...

你说的对,我改了一下,好了,这段程序是从书上弄下来的,我有个疑问,为什么作者会讲LinkList的类型设置为struct Node*类型,而不直接设置为Node类型呢?

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define OK 1
  4. #define ERROR 0
  5. #define TRUE 1
  6. #define FALSE 0

  7. typedef int Status;
  8. typedef int ElemType;
  9. typedef struct Node{
  10.     ElemType data;
  11.     struct Node *next;
  12. }Node;

  13. typedef Node LinkList;

  14. /*输出所有元素*/
  15. void PrintfAllElem(LinkList* L){
  16.     Node *p = (Node*)L;
  17.     int i = 0;
  18.     while (p) {
  19.         printf("index is %d,data is %d\n",i,p->data);
  20.         p=p->next;
  21.         ++i;
  22.     }
  23. }

  24. /*单链表的读取*/
  25. Status GetElem(LinkList L,int i,ElemType* e){
  26.     Node* p = L.next;
  27.     int j = 1;
  28.    
  29.     while (j<i && p) {
  30.         p = p->next;
  31.         j++;
  32.     }
  33.    
  34.     if (!p || j > i)
  35.         return ERROR;
  36.     *e = p->data;
  37.     return OK;
  38. }

  39. /*插入节点*/
  40. Status InsertElem(LinkList *list,int i,ElemType e)
  41. {
  42.     Node *p;
  43.     int j;
  44.    
  45.     p = (Node*)list;
  46.     j = 1;//从第一个位置开始数
  47.    
  48.     while (p && j<i) {
  49.         j++;
  50.         p = p->next;
  51.     }
  52.    
  53.     if (!p || j>i) {
  54.         return ERROR;
  55.     }
  56.    
  57.     Node* new = malloc(sizeof(Node));
  58.    
  59.     new->next = p->next;
  60.     new->data = e;
  61.     p->next = new;
  62.    
  63.     return  OK;
  64. }
  65. /*删除节点*/
  66. Status DelElem(LinkList *list,int i){
  67.     Node *p,*q;
  68.     int j;
  69.     p = (Node*)list;
  70.     j = 1;
  71.    
  72.     while (p && j<i) {
  73.         p = p->next;
  74.         j++;
  75.     }
  76.    
  77.     if (!p || j>i) {
  78.         return ERROR;
  79.     }
  80.    
  81.     q = p->next;
  82.     p->next = q->next;
  83.     q->next = NULL;
  84.     free(q);
  85.    
  86.     return OK;
  87. }

  88. int main(int argc, const char * argv[]) {
  89.    
  90.     LinkList* l = malloc(sizeof(LinkList));
  91.     Node *n = malloc(sizeof(Node));

  92.     l->next = n;
  93.     l->data = 0;
  94.    
  95.     n->data = 1;
  96.     n->next = NULL;
  97.    
  98.     InsertElem(l, 2, 3);
  99.     InsertElem(l, 3, 4);
  100.     InsertElem(l, 4, 5);
  101.    
  102.     PrintfAllElem(l);
  103.    
  104.     return 0;
  105. }
复制代码

作者: fantacyleo    时间: 2014-9-23 12:46
cjfire 发表于 2014-9-23 11:41
你说的对,我改了一下,好了,这段程序是从书上弄下来的,我有个疑问,为什么作者会讲LinkList的类型设置 ...

设为指针可以节约内存。无论结构体本身包含多少个成员,指针所占字节都只和机器字长有关。这样在函数调用传实参时就不必复制整个结构体
作者: 陨石    时间: 2014-9-23 13:20
数据结构基础啊
作者: cjfire    时间: 2014-9-23 15:40
fantacyleo 发表于 2014-9-23 12:46
设为指针可以节约内存。无论结构体本身包含多少个成员,指针所占字节都只和机器字长有关。这样在函数调用 ...

非常感谢。
作者: housq    时间: 2014-9-23 17:56
cjfire 发表于 2014-9-23 11:41
你说的对,我改了一下,好了,这段程序是从书上弄下来的,我有个疑问,为什么作者会讲LinkList的类型设置 ...

指针更符合人们的习惯,也防止出错
作者: cjfire    时间: 2014-9-23 20:47
housq 发表于 2014-9-23 17:56
指针更符合人们的习惯,也防止出错

多谢,我觉得fantacyleo说的挺好的。谢谢你们。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2