求C/C++高手帮忙看下下面创建链表的程序,输入第一个选择y后出现内存不能为written,是什么错误呀?

#include<stdio.h>#include<stdlib.h>voidmain(){chari,t;intc=0;structnode{intdata;struc... #include<stdio.h>
#include<stdlib.h>
void main()
{
char i,t;
int c=0;
struct node
{
int data;
struct node *next;
};
struct node *head,*p,*tail;
head=tail=NULL;
while(c==0)
{ printf("增加节点吗?\nyes******Y\nno*******N\n");
scanf("%c",&i);
if(i=='y')
{
c=0;
p=(struct node *)malloc(sizeof(struct node));
printf("请输入想要保存的字母!\n");
scanf("%c",&t);
p->data=i;
p->next=NULL;
if(head==tail==NULL)
head=tail=p;
else
{
tail->next=p;
tail=p;
}
}
else
{
c=1;
printf("程序结束!!!!");
}
}

}
展开
 我来答
沧海雄风2009
2012-09-10 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8525
采纳率:79%
帮助的人:2752万
展开全部

说白了  你没理解链表 

 

甚至可以说 都没死记硬背 记住链表的整体格式

 

#include<stdio.h>

#include<stdlib.h>

void main()

{   

 char i,t;

 int c=0;

 struct node

 { 

  int data;

  struct node *next;

 };

 struct node *head,*p,*tail;

 head=tail=(struct node *)malloc(sizeof(struct node));   //头指针没分配空间怎么能行

 while(c==0)

 {     

  printf("增加节点吗?\nyes******Y\nno*******N\n");

  fflush(stdin);   //吸收多余换行符

  scanf("%c",&i);

 if(i=='y')

 {

  c=0;

  p=(struct node *)malloc(sizeof(struct node));

  printf("请输入想要保存的字母!\n");

  fflush(stdin);   //吸收多余换行符

  scanf("%c",&t);

  p->data=i;

  p->next=NULL;

  if(head==tail==NULL)

   head=tail=p;

  else

  {

   tail->next=p;

   tail=p;

  }

 }

 else

 {   

  c=1;

  printf("程序结束!!!!");

 }

 }

 

 

 

更多追问追答
追问
嗯,我新手纳,问下scanf()后面要吸收多余换行符是怎么回事?还有,head已经定义了struct node *head 为什么后面还要用(struct node *)强制转换呢?
追答
head是定义 了

但是作为 指针 你并没有给他分配空间
shaoqi08110820
2012-09-10 · TA获得超过2508个赞
知道大有可为答主
回答量:1514
采纳率:100%
帮助的人:1714万
展开全部
#include<stdio.h>
#include<stdlib.h>
void main()
{
char i,t;
int c=0;
struct node
{
int data;
struct node *next;
};
struct node *head,*p,*tail;
head=tail=NULL;
while(c==0)
{ printf("增加节点吗?\nyes******Y\nno*******N\n");
scanf("%c",&i);
if(i=='y')
{
c=0;
p=(struct node *)malloc(sizeof(struct node));
printf("请输入想要保存的字母!\n");
scanf("%c",&t);
p->data=i;
p->next=NULL;
if(head==NULL && tail==NULL) ////
head=tail=p;
else
{
tail->next=p;
tail=p;
tail->next=NULL; ////
}
}
else
{
c=1;
printf("程序结束!!!!");
}
}

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tsdl1234
2012-09-10 · TA获得超过4323个赞
知道小有建树答主
回答量:712
采纳率:0%
帮助的人:300万
展开全部
两个问题

1、 if(head==tail==NULL) if语句不能这么写 你的这个if语句里 先计算head==tail 如果相等结果为1 然后是比较1==NULL 整型数据和指针比较明显是错误的

改成if ((head == NULL) && (tail == NULL))就行了

如果不该的话 我的编译器直接不通过 不知道你的是怎么回事
2、用scanf的话 应该及时清除标准输入的缓冲区 最简单的方法是scanf语句结束后 加一个while((a = getchar()) != '\n'); a是char型变量 不要忘了while语句最后的分号

改完以后我这里是能正确运行了 有什么问题再追问把
更多追问追答
追问
对也,多亏提醒,我又忘记了,所谓的输入缓冲区是怎么回事?scanf和gets的区别我一直没理解
追答
所谓的输入缓冲区  可以简单理解为   你从键盘上输入的数据   暂时存储在这个缓冲区里   需要的时候再存储到相应的变量里   通常用scanf的时候   会有多余的换行符  也就是回车  或者'\n'   用楼上的fflush(stdin)也可以  用我那个while语句也行   不过fflush(stdin)不是标准C规定的   有的编译器可能不支持这个用法   我的GCC就不支持   具体的你可以直接百度  百科里介绍的挺详细的
以后最好养成在有多个scanf的时候每个scanf后都清除一下输入缓冲区的习惯
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
乜天沅22
2012-09-11 · 超过21用户采纳过TA的回答
知道答主
回答量:55
采纳率:0%
帮助的人:37.3万
展开全部
if(head==tail==NULL)
这个if里的意思判断不是三个值相等,而是先判断(head==tail)是否为真,然后再判断((head==tail)的结果==NULL)是否为真。
在你的程序里判断过程就是:1、head与tail相等,所以结果为真;2、真的值是1,而NULL的值是0,(1==0)的结果是假,所以(head==tail==NULL)的结果就是假,你的if是不会进去的。
建议你把if语句改成: if(head==NULL && tail==NULL)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式