单链表生成,有点小问题,请来看一下

bingbing1981 2004-11-24 03:56:28
#include <stdio.h>
#include <malloc.h>

#define NULL 0

typedef struct node{
char data;
struct node* next;
}NODE;

NODE* create(int n)
{
NODE *head,*p,*q;

if(n == 0)
{
return NULL;
}
else
{
head = (NODE*)malloc(sizeof(NODE));
p = head;
for(int i = 0; i < n; i++)
{
printf("请输入第%d个链表结点的内容:",i+1);
scanf("%c\n",&(p->data));
if(i==(n-1))
{
p->next = NULL;
break;
}
else
{
q = (NODE*)malloc(sizeof(NODE));
p->next = q;
p = q;
}
}
return head;
}
}

main()
{
int n;
NODE *head,*p;
head = (NODE*)malloc(sizeof(NODE));
printf("\n请输入链表的长度:");
scanf("%d",&n);
head = create(n);

if(head == NULL)
printf("空链表!\n");
else
{
p = head;
printf("\n生成的链表为:");
p = (NODE*)malloc(sizeof(NODE));
p = head;
for(int i = 0; i < n; i++)
{
printf("%c",p->data);
if(i!=(n-1) && i>0)
{
p = p->next;
printf("->");
}
}
}
return 0;
}

我的问题是:为什么第一次输入的结点的内容不保存在head->data中
运行起来后总是少显示一个结点
比如n=5,就只出来4个
看了好半天也没弄明白哪出问题了,请帮忙看看
...全文
108 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tureyuel 2004-11-24
  • 打赏
  • 举报
回复
你好,你的代码有不少不妥的地方,可以把以下我改过的代码试试,然后加以比较:

#include <stdio.h>
#include <malloc.h>

#define NULL 0

typedef struct node{
char data;
struct node* next;
}NODE;

NODE* create(int n)
{
NODE *head,*p,*q;

if(n == 0)
{
return NULL;
}
else
{
head = (NODE*)malloc(sizeof(NODE));
p = head;
for(int i = 0; i < n; i++)
{
printf("请输入第%d个链表结点的内容:",i+1);
scanf("\n%c",&(p->data)); /***此处更改*****/
if(i==(n-1))
{
p->next = NULL;
break;
}
else
{
q = (NODE*)malloc(sizeof(NODE));
p->next = q;
p = q;
}
}
return head;
}
}

main()
{
int n;
NODE *head,*p;
// head = (NODE*)malloc(sizeof(NODE)); /***此处更改****/
printf("\n请输入链表的长度:");
scanf("%d",&n);
head = create(n);

if(head == NULL)
printf("空链表!\n");
else
{
// p = head; /***此处更改*****/
printf("\n生成的链表为:");
// p = (NODE*)malloc(sizeof(NODE));/***此处更改*****/
p = head;
for(int i = 0; i < n; i++)
{
printf("%c",p->data);
if(i < n-1) /***此处更改*****/
{
p = p->next;
printf("->");
}
}
}
return 0;
}
另外,象这样在CREAT()里面申请了空间过后又不释放,是会消耗内存的,(!!!)只不过这个程序小,影响不大!

bingbing1981 2004-11-24
  • 打赏
  • 举报
回复
嗯,已经修改完毕
把正确的贴上:
#include <stdio.h>
#include <malloc.h>

#define NULL 0

typedef struct node{
char data;
struct node* next;
}NODE;

NODE* create(int n)
{
NODE *head,*p,*q;

if(n == 0)
{
return NULL;
}
else
{
p = (NODE*)malloc(sizeof(NODE));
head = p;
for(int i = 0; i < n; i++)
{
printf("ÇëÊäÈëµÚ%d¸öÁ´±íÔªËصÄÄÚÈÝ:",i+1);
fflush(stdin);
scanf("%c",&(p->data));
printf("ÄúÊäÈëµÄµÚ%d¸öÁ´±íÔªËصÄÄÚÈÝÊÇ:%c\n",i+1,p->data);
if(i==(n-1))
{
p->next = NULL;
break;
}
else
{
q = (NODE*)malloc(sizeof(NODE));
p->next = q;
p = q;
}
}
return head;
}
}

main()
{
//Á´±íµÄ³¤¶È£¬ÓÉÓû§ÊäÈë
int n;
//¶¨ÒåÈý¸öÁ´±í½áµãÖ¸Õë
NODE *head,*p;
head = (NODE*)malloc(sizeof(NODE));
printf("ÇëÊäÈëÁ´±íµÄ³¤¶È:");
scanf("%d",&n);
printf("\n");
head = create(n);

if(head == NULL)
printf("¿ÕÁ´±í!\n");
else
{
p = head;
printf("\nÉú³ÉµÄÁ´±íΪ:");
p = (NODE*)malloc(sizeof(NODE));
p = head;
for(int i = 0; i < n-1; i++)
{
printf("%c->",p->data);
p = p->next;
}
printf("%c",p->data);
}
return 0;
}
huangyang88 2004-11-24
  • 打赏
  • 举报
回复
还有这个if(i!=(n-1) && i>0)
改为if(i!=(n-1) && i>=0)
bingbing1981 2004-11-24
  • 打赏
  • 举报
回复
加上之后为什么总要输入两次回车才能结束啊
huangyang88 2004-11-24
  • 打赏
  • 举报
回复
printf("请输入第%d个链表结点的内容:",i+1);
/*在这后面加上下面一条语句,因为输入流里面还有数据,所以再次读的时候要清空*/
fflush(stdin);

69,364

社区成员

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

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