免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: liec
打印 上一主题 下一主题

请大家帮我看看这个程序的问题出在哪里,在下谢过了!关于链表的 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-09-30 10:57 |只看该作者
原帖由 liec 于 2006-9-28 08:06 发表
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
        int data;
        struct node *next;
}linklist;

void creatlist(linklist *S)            /* 就是这个函数的使用, ...


void createlist(linklist* S)
在这里S是一个形参.
改成void createlist(linklist** S)
然后做其他改动.

论坛徽章:
0
12 [报告]
发表于 2006-10-04 11:56 |只看该作者
为什么不直接在 main中分配空间呢

论坛徽章:
0
13 [报告]
发表于 2006-10-04 23:23 |只看该作者
无聊一下哈,除了楼上各位指出的东东,我说些无关紧要的哈:
1。我第一眼看到你的函数createlist以为你要创建一个链表(并猜建空表),继续看才知道是创建一个结点,可以改改名,比如用GetNode,让人从名字上能大概判断出功能来(当然回过头看你的结点结构也有这样的问题哈)
2。应该采取一定的策略释放链表哈(这个编程习惯比较重要)

论坛徽章:
0
14 [报告]
发表于 2006-10-05 17:28 |只看该作者
改成void createlist(linklist** S)
这里为什么一定要用2级指针啊??

论坛徽章:
0
15 [报告]
发表于 2006-10-05 17:44 |只看该作者
指向指针的指针!为了更改指针的值

论坛徽章:
0
16 [报告]
发表于 2006-10-06 01:12 |只看该作者
参考FreeBSD <sys/queue.h> 的 SLIST_ 系列宏的实现,简洁高效!

论坛徽章:
0
17 [报告]
发表于 2006-10-06 11:24 |只看该作者
我做了这样的修改(只改了creatlist和main函数),我不知道错在哪里??
creatlist函数的形参是指针型,应该是地址传递,不是值传递,为什么还是不对呢?
平时2级指针用的不多,希望大牛们指导俺一下

     10 void creatlist(linklist *S)
     11 {
     12     S = (linklist *)malloc(sizeof(linklist));
     13     if (S == NULL){
     14         printf ("No enough memory!\n");
     15     }
     16     else {
     17         (S -> next = NULL);
     18     }
     19 }


     33 int main( void )
     34 {
     35     int n,i;
     36     linklist *L, *S;
     37     creatlist(L);
     38     printf ("Input the items you want:");
     39     scanf ("%d",&n);
     40     for (i = 0; i < n; i ++ ){
     41         creatlist(S);
     42         L -> next = S;
     43         printf ("Input the %d data:", i + 1);
     44         scanf ("%d",S -> data);
     45     }
     46     outputlist(L);
     47 }

论坛徽章:
0
18 [报告]
发表于 2006-10-06 12:04 |只看该作者
原帖由 huaxue 于 2006-10-6 11:24 发表
我做了这样的修改(只改了creatlist和main函数),我不知道错在哪里??
creatlist函数的形参是指针型,应该是地址传递,不是值传递,为什么还是不对呢?
平时2级指针用的不多,希望大牛们指导俺一下

     10  ...



你的 createlist() 完全不能工作

前面已经有人提过,建议分两个函数来

一个:
void init_list(linklist ** s)
{
        *s = (linklist *)malloc(sizeof(linklist));
        if (!s) {
               printf("No enough memory\n");
               exit(-1);
        }

        memset(*s, 0, sizeof(linklist));
}


另一个:

linklist * get_node()
{
        linklist *t = (linklist *)malloc(sizeof(linklist));
        if (!t) {
               printf("No enough memory\n");
               exit(-1);
        }

        memset(t, 0, sizeof(linklist));

        return t;
}


void create_list(linklist *L, int size)
{
             int i = 0;
            
             init_list(&L);
            
             while (i++ < size) {
                       L->next = get_node();
                       L = L->next;
                       ... ...
             }
}

[ 本帖最后由 mik 于 2006-10-6 12:23 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2006-10-06 12:42 |只看该作者
mik 兄,你粗心了,应该将最后一行改下:

  1. void init_list(linklist ** s)
  2. {
  3.         *s = (linklist *)malloc(sizeof(linklist));
  4.         if (!s) {
  5.                printf("No enough memory\n");
  6.                exit(-1);
  7.         }

  8.         memset(*s, 0, sizeof(linklist)); /*我觉得该改成这样 memset(**s, 0, sizeof(linklist)); */
  9. }
复制代码



呵呵,发现你这个习惯,每次都来 memset一下,我很少这样做,不知道会不会出现问题。。

论坛徽章:
0
20 [报告]
发表于 2006-10-06 12:54 |只看该作者
原帖由 harly 于 2006-10-6 12:42 发表
mik 兄,你粗心了,应该将最后一行改下:

[code]void init_list(linklist ** s)
{
        *s = (linklist *)malloc(sizeof(linklist));
        if (!s) {
               printf("No enough memory ...



晕~, 你知道 **s 是什么吗?

**s 是 linklist 实体
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP