求C/C++高手帮忙看下下面创建链表的程序,输入第一个选择y后出现内存不能为written,是什么错误呀?
#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("程序结束!!!!");
}
}
} 展开
说白了 你没理解链表
甚至可以说 都没死记硬背 记住链表的整体格式
#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是定义 了
但是作为 指针 你并没有给他分配空间
#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("程序结束!!!!");
}
}
}
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后都清除一下输入缓冲区的习惯
这个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)