链表初级

lkj2016 2017-01-05 04:46:04
#include<stdio.h>
#include<stdlib.h>
struct node{
int num;
struct node *next;
};
typedef struct node SNODE;
SNODE *creat()
{
SNODE *r,*h,*p;
int data;
h=(SNODE*)malloc(sizeof(SNODE));
r=h;
while(scanf("%d",&data),data!=-1)
{
p=(SNODE*)malloc(sizeof(SNODE));
r->next=p;
p->num=data;
r=p;
}
p->next='\0';//这局改成p='\0'为什么会死循环,改成这样不是应该少输出一个字符就可以了吗,为什么死循环了
return h;
}
void print(SNODE *head)
{
SNODE *p;
p=head->next;
if(p=='\0')
printf("\nLinkList is NULL");
else
{
printf("\nhead");
do{
printf("->%d",p->num);
p=p->next;
}while(p!='\0');
printf("->end");
}
}
int main()
{
SNODE *head;
head=creat();
print(head);
return 0;
}
...全文
99 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2017-01-05
  • 打赏
  • 举报
回复
如果是初学者,不建议使用别人看不懂的或者看着别扭的语法形式去写代码。比如while (scanf("%d", &data), data != -1).写这个没错,逗号运算符嘛,以最后一个表达式作为判断true或者false,但是你考虑scanf("%d", &data)出错的情况吗?虽然一般不会出错。但是一般不出错不等于以后总不出错。 建议,按部就班,杜绝小的技巧导致大的错误。
自信男孩 2017-01-05
  • 打赏
  • 举报
回复

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

struct node{
    int num;
    struct node *next;
};

typedef struct node SNODE;

SNODE *creat(void)
{
    int ret;
    SNODE *r,*h,*p;
    int data;
    h = (SNODE*)malloc(sizeof(SNODE));
    if (!h) {
        fprintf(stderr, "Malloc error!\n");
        return NULL;
    }
    r = h;

    ret = scanf("%d", &data);
    while(ret > 0 && data != -1)
    {
        p = (SNODE*)malloc(sizeof(SNODE));
        if (!p) {
            fprintf(stderr, "Malloc error!\n");
            return NULL;
        }
        p->num = data;
        p->next = NULL;
        r->next = p;
        r = p;
        ret = scanf("%d", &data);
    }
    p->next = NULL;

    return h;
}
void print(SNODE *head)
{
    SNODE *p = NULL;
    p = head->next;

    if(!p)
        printf("\nLinkList is NULL");
    else
    {
        printf("\nhead");
        do {
            printf("->%d",p->num);
            p=p->next;
        }while(p != NULL);
        printf("->end");
    }
}
int main()
{
    SNODE *head;

    head = creat();
    print(head);

    return 0;
}
其实没有多复杂的为什么。你的语法就不应该这样,虽然编译器不给你指出错误,但是这样写就是不合法的。因为写的不对,所以结果就不能按照你想法输出。 语法上对于空指针,就是NULL,不要用'\0',先搞明白'\0', NULL, "0", 0这些是什么,做什么用。在什么地方用什么符号,不要混哦。
小灸舞 版主 2017-01-05
  • 打赏
  • 举报
回复
p->next不赋值的话,是个垃圾值(并不是NULL,或者说'\0')
然后就会找到垃圾值对应的地址,然后继续next
然后就会跳不出你print函数里的while循环
  • 打赏
  • 举报
回复
p是一个指针
while(scanf("%d",&data),data!=-1)
 {
  p=(SNODE*)malloc(sizeof(SNODE));
  r->next=p;
  p->num=data;
  r=p;
 }
看看这里面最后r = p ; 然后现在你在while之后让p = NULL; 让p的指针指向了一个未知的空间,也就让在while循环中的r = NULL;所以最后程序运行的时候,你可以看到前三个数字都已经输出,然后最后本应该结束的地方却无限的的输出一个未知的值,这是因为在print的时候无法检测到停止的地方; 也就是这里
do{
   printf("->%d",p->num);
   p=p->next;
  }while(p!='\0');
  printf("->end");

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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