免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7650 | 回复: 12
打印 上一主题 下一主题

单链表的初始化问题,困扰很久希望高手帮帮我! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-27 21:05 |只看该作者 |倒序浏览
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>

typedef                struct        Node        /*结点类型定义*/
{
        char        name[50];
        int                x;
    int                y;
        struct                Node*                next;
}   Node,                *Linkcity;


void Initcity(Linkcity         *L)        /*初始化链表*/
{   
        *L=(Linkcity)malloc(sizeof(Node));
   (*L)->next=NULL;
}


Linkcity Createcity(Linkcity        L)        /*创建链表*/
{
    Node        *s,*r;
        r=L,s=NULL;
        int                x=0;
        int                y=0;
        int                flag=1;
        while(flag)
        {
                s=(Node *)malloc(sizeof(Node));
                printf("请输入城市名\n");
                        scanf("%s",&s->name);
                if(!strcmp(s->name,"out"))
                {       
                        flag=0;
                }
                else
                {
                        printf("请输入城市x y坐标\n");
                        scanf("%d %d",&x,&y);
                        s->x=x;s->y=y;
                        s->next=r->next;
                        r=s;
                }
        }
        return L;
}


void main()
{
        Linkcity L=NULL;

Initcity(&L);
Createcity(L);

}



这个完全能通过编译,运行也没什么问题,但是为什么我不能将
void Initcity(Linkcity         *L)        /*初始化链表*/
{   
        *L=(Linkcity)malloc(sizeof(Node));
   (*L)->next=NULL;
}
改成
void Initcity(Linkcity        L)        /*初始化链表*/
{   
        L=(Linkcity)malloc(sizeof(Node));
   L->next=NULL;
}
感觉没什么变化啊,就是通不过编译了,希望指教!困扰多时!

论坛徽章:
0
2 [报告]
发表于 2009-05-27 21:12 |只看该作者
因为你传入的&L是地址,你也要用一个指针接着,如果不加*那是一个结构体,肯定是编译不通过的

论坛徽章:
0
3 [报告]
发表于 2009-05-27 21:23 |只看该作者
也就是说我吧传的地址改了能够通过编译,试试,太谢谢了!

论坛徽章:
0
4 [报告]
发表于 2009-05-27 22:11 |只看该作者
还是有很大的不同,改了之后很用以程序就死了。为什么,两种初始化有什么区别,后面调用时的参数类型我已经修改了。还是存在问题,是运行的时候产生的问题,高手解决一下!

论坛徽章:
0
5 [报告]
发表于 2009-05-28 04:19 |只看该作者
C语言基础知识点:

  1. C函数的参数是按值传递: 函数内部对传入参数(形参)的修改不影响实际传入的参数值(实参)。
  2. 指针的内容是一个地址: 指针是一个保存值的地方, 只是它的值是地址(另外一个变量的地址,一段内存的首址,等)

类比一下swap函数:  

int a=2 , b = 3;
swap(a, b)    // 不会修改 a ,b 的值。
swap(&a, &b)   // 函数里面修改传入变量的值,需要传地址。

反观你的程序

  Linkcity L=NULL; // 声明了一个变量

  Initcity(&L);    // 希望在函数里面改变L的值,即给L赋值为一段内存的首址,所以传地址

你也可以用这种写法:

    Linkcity L = Initcity();

    Linkcity  Initcity(){
        Linkcity L = malloc();

        do_init();

        return L;
    }

基础很重要!!!!!!

论坛徽章:
0
6 [报告]
发表于 2009-05-28 22:53 |只看该作者
楼主你改了以后,传的是值,不是地址了
你的main函数中的L和你初始化中的那个没什么关系了,当然不对

论坛徽章:
0
7 [报告]
发表于 2009-05-28 23:42 |只看该作者
还是很混,理不清,谁给串代码我啊!求求你们了,拜托!

论坛徽章:
0
8 [报告]
发表于 2009-05-29 00:05 |只看该作者
LZ 你不用同一个问题发表多个贴子吧。

自已应该学会调试程序,这是必经之路。



我给你一个实现例子吧,结构就随便定义了:


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

struct X {
        int a;
        struct X *next;
};

struct X *get_node()
{
        struct X *x = (struct X)malloc(sizeof(struct X));
        if (x == NULL) {
                printf("malloc error\n");
                exit(-1);
        }

        x->a = 0;
        x->next = NULL:

        return x;
}


void init_link(struct X **x)
{
        int i;
        struct X *p = *x;
        struct X *q = *x;

        if (p == NULL) {
                p = get_node();
                q = p;
        } else {
                while (p->next)
                         p = p->next;
        }

        for (i = 1;  i <= 10; i++) {
                p->a = i;
                p->next = get_node();                   /**** BUG *****/
                p = p->next;
        }


       *x = q;                     /* 写 link 链 */
}


void list_link(struct X *link)
{
         while (link) {
                 printf("a: %d\n", link->a);
                 link = link->next;
         }
}



int main()
{
        struct X *link = NULL;

         init_link(&link);
         list_link(link);
}



上面标注的地方,还有一个小小的 bug,我就不修改了,自己看着办

论坛徽章:
0
9 [报告]
发表于 2009-05-29 00:18 |只看该作者
谢谢了。我认真看看,很惭愧!

论坛徽章:
0
10 [报告]
发表于 2009-05-29 00:24 |只看该作者
原帖由 iwaich 于 2009-5-29 00:18 发表
谢谢了。我认真看看,很惭愧!



你这样也配说“惭愧”

不就是刚学 C,又不是老手。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP