新手求助:写链表时遇到的问题

懒死的猫 2018-09-30 05:46:28
目的:创建单链表,输入,然后打印出来;
编译运行结果:可以输入,但ENTER之后没反应;;
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct Node
{
int data;
struct Node *next;
}DLinklist;


//创建链表并写入
void InitList(DLinklist *head , int n)
{
int i;
DLinklist *p,*s;
head = (DLinklist*)malloc(sizeof(DLinklist));
head -> next = NULL;
p = head;
for(i = 1;i <= n;++i)
{
s = (DLinklist*)malloc(sizeof(DLinklist));
scanf("%d",&s -> data);
s -> next = NULL;
p -> next = s;
p = s;
}
}



//打印链表
void print(DLinklist *head)
{
DLinklist *s = head -> next;
while(s -> next != NULL)
{
printf("%d",s -> data);
s = s -> next;
}
}

int main()
{
DLinklist *head;
InitList(head,8);
print(head);
return 0;
}
...全文
719 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-10-26
  • 打赏
  • 举报
回复
数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
Healer_S 2018-10-25
  • 打赏
  • 举报
回复
非主函数内的定义是临时的空间,楼主应该先去了解下
变量 作用域和生命周期


ikaoni 2018-10-25
  • 打赏
  • 举报
回复
head节点data没赋值,实际上是创建了n+1个节点
qq_33601473 2018-10-10
  • 打赏
  • 举报
回复
这个地方的操作符是什么意思
李财日记 2018-10-02
  • 打赏
  • 举报
回复
有几点错误:函数值传递还是址传递都是将变量以副本形式传递的,也就是说传址的时候函数用到的指针的地址和你传入函数的指针的地址是不一样的,但他们指向的内容是一样的。这样你在函数内部对指针赋值只是对传入指针的副本赋值,但两者的地址不一样,不是同一个指针,你的赋值对传入指针无效,你可以采用二级指针来改变这种情况。
李财日记 2018-10-02
  • 打赏
  • 举报
回复
函数传参不论是传值还是传址都会分配内存存放中间变量,对于传址来说(也就是指针),函数先分配一块内存来存放传入的地址(也就是指针)什么东西能存指针呢?显然是二级指针。你对head赋值其实是对函数新分配的二级指针赋值,并不能改变函数外head的指向。你可以在函数内打印head的地址并且在函数外部也打印head的地址(注意不是head指向的地址)你会发现函数内外的head并不是同一个head。
李财日记 2018-10-02
  • 打赏
  • 举报
回复
在函数外部定义一个指针p,在函数内部给该指针赋值,函数结束对指针要生效,需要用到二级指针。
zangfong 2018-09-30
  • 打赏
  • 举报
回复
你在调用InitList(head,8)时,传入的实参head,其实是head的拷贝,而你实际上是给head的拷贝分配了空间,而head实参并不指向该空间。 你可以尝试下面两种方式: 第一种,就是InitList时返回head指针
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct Node
{
    int data;
    struct Node *next;
}DLinklist;


//创建链表并写入
DLinklist * InitList(DLinklist *head , int n)
{
    int i;
    DLinklist *p,*s;
    head = (DLinklist*)malloc(sizeof(DLinklist));
    head -> next = NULL;
    p = head;
    for(i = 1;i <= n;++i)
    {
        s = (DLinklist*)malloc(sizeof(DLinklist));
        scanf("%d",&s -> data);
        s -> next = NULL;
        p -> next = s;
        p = s;
    }
    return head;
}



//打印链表
void print(DLinklist *head)
{
    DLinklist *s = head -> next;
    while(s != NULL)
    {
        printf("%d",s -> data);
        s = s -> next;
    }
}

int main()
{
    DLinklist *head;
    head = InitList(head,8);
    print(head);
    return 0;
}
第二种,直接在main函数中给head分配空间并让head指向该空间,那么在调用 InitList(head,8);时,head的拷贝实际上也指向该空间,后序操作就一样了。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct Node
{
    int data;
    struct Node *next;
}DLinklist;


//创建链表并写入
void InitList(DLinklist *head , int n)
{
    int i;
    DLinklist *p,*s;
    p = head;
    for(i = 1;i <= n;++i)
    {
        s = (DLinklist*)malloc(sizeof(DLinklist));
        scanf("%d",&s -> data);
        s -> next = NULL;
        p -> next = s;
        p = s;
    }
}



//打印链表
void print(DLinklist *head)
{
    DLinklist *s = head -> next;
    while(s != NULL)
    {
        printf("%d",s -> data);
        s = s -> next;
    }
}

int main()
{
    DLinklist *head;

    head = (DLinklist*)malloc(sizeof(DLinklist));
    head -> next = NULL;

    InitList(head,8);
    print(head);
    return 0;
}
另外,你的print函数中的判断条件while(s -> next != NULL)会导致最后一个节点无法输出,所以我改了下。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧