#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
//单链表结构
typedef int datatype;
typedef struct node
{
datatype data;
struct node *next;
}linklist;
linklist *head,*p;//指针类型说明
/*头插法建表
用头插法建成的链表中结点的次序和输入的顺序是相反的。
*/
linklist *CREATLISTF(){
char ch;//逐个输入字符,以'#'为结束符,返回单链表头指针
linklist * head,*s;
head=NULL;//链表开始为空
ch=getchar();//读入第一个结点的值
while(ch!='#')
{
s=malloc(sizeof(linklist));//生成新的结点
s->data=ch;
s->next=head;
head=s;//将新结点插入到表头上
ch=getchar();//读入下一个结点的值
}
return head;//返回表头指针
}
//计算不带头结点的单链表的长度,然后输出单链表
void Print(linklist *L)
{
int num=0;
linklist *p;
p=L;
while(p)
{
printf("%c ",p->data);
p=p->next;
num++;
}
printf("\nthe length is :%d\n",num);
}
//尾插法——返回表的头指针
linklist *CREATLISTR(){
char ch;
linklist * head,*s,*r;
head=NULL;//置空链表
r=NULL;//尾指针初值为空。
ch=getchar();
while(ch!='#'){
s=malloc(sizeof(linklist));//生成新的结点
s->data=ch;
if (head==NULL)
head=s;
else
r->next=s;
r=s;
ch=getchar();
}
if(r!=NULL)
r->next=NULL;
return head;
}
//查找——按照序号查找
//主函数
int main(){
linklist *f,*r ;
//printf("head insert:\n");
//f=CREATLISTF();//头插法建立单链表
//Print(f);//打印链表和链表的长度
printf("tail insert:\n");
r=CREATLISTR();//尾插法
Print(r);
}
=============调用头插法和尾插法,右边是输出结果============================
==============只是调用尾插法,右边是输出结果==============================
在主函数中先是调用头插法再调用尾插法。但是尾插法输出的长度多了一个。如果只是在调用尾插法,长度就正常输出了。这到底是什么原因??
楼主你到底有没有加fflush(stdin)啊
加在main函数调用头插法和尾插法之间
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
//单链表结构
typedef int datatype;
typedef struct node {
datatype data;
struct node *next;
} linklist;
linklist *head, *p; //指针类型说明
/*头插法建表
用头插法建成的链表中结点的次序和输入的顺序是相反的。
*/
linklist *CREATLISTF() {
char ch; //逐个输入字符,以'#'为结束符,返回单链表头指针
linklist * head, *s;
head = NULL; //链表开始为空
ch = getchar(); //读入第一个结点的值
while (ch != '#') {
s = (linklist *)malloc(sizeof(linklist)); //生成新的结点
s->data = ch;
s->next = head;
head = s; //将新结点插入到表头上
ch = getchar(); //读入下一个结点的值
}
return head; //返回表头指针
}
//计算不带头结点的单链表的长度,然后输出单链表
void Print(linklist *L) {
int num = 0;
linklist *p;
p = L;
while (p) {
printf("%c ", p->data);
p = p->next;
num++;
}
printf("\nthe length is :%d\n", num);
}
//尾插法——返回表的头指针
linklist *CREATLISTR() {
char ch;
linklist * head, *s, *r;
head = NULL; //置空链表
r = NULL; //尾指针初值为空。
ch = getchar();
while (ch != '#') {
s = (linklist *)malloc(sizeof(linklist)); //生成新的结点
s->data = ch;
if (head == NULL)
head = s;
else
r->next = s;
r = s;
ch = getchar();
}
if (r != NULL)
r->next = NULL;
return head;
}
//查找——按照序号查找
//主函数
int main() {
linklist *f, *r;
printf("head insert:\n");
f=CREATLISTF();//头插法建立单链表
Print(f);//打印链表和链表的长度
fflush(stdin);
printf("tail insert:\n");
r = CREATLISTR(); //尾插法
Print(r);
}
因为先调用完头插法(楼主是以#来判断读入结束的,那么就导致最后输入缓冲区里会遗留一个回车符)
再调用尾插法的时候,首先插入的节点就是\n,所以楼主打印的时候没有发现吗,多了一个空行和一个空格
(所以第二种,直接调用尾插法是正确的,不存在这个遗留的回车)
所以在两者之间加一个fflush(stdin);或者getchar()清楚掉回车符就好了
#include
#include
#include
//单链表结构
typedef int datatype;
typedef struct node {
datatype data;
struct node *next;
} linklist;
linklist *head, *p; //指针类型说明
/*头插法建表
用头插法建成的链表中结点的次序和输入的顺序是相反的。
*/
linklist *CREATLISTF() {
char ch; //逐个输入字符,以'#'为结束符,返回单链表头指针
linklist * head, *s;
head = NULL; //链表开始为空
ch = getchar(); //读入第一个结点的值
while (ch != '#') {
s = malloc(sizeof(linklist)); //生成新的结点
s->data = ch;
s->next = head;
head = s; //将新结点插入到表头上
ch = getchar(); //读入下一个结点的值
}
return head; //返回表头指针
}
//计算不带头结点的单链表的长度,然后输出单链表
void Print(linklist *L) {
int num = 0;
linklist *p;
p = L;
while (p) {
printf("%c ", p->data);
p = p->next;
num++;
}
printf("\nthe length is :%d\n", num);
}
//尾插法——返回表的头指针
linklist *CREATLISTR() {
char ch;
linklist * head, *s, *r;
head = NULL; //置空链表
r = NULL; //尾指针初值为空。
ch = getchar();
while (ch != '#') {
s = malloc(sizeof(linklist)); //生成新的结点
s->data = ch;
if (head == NULL)
head = s;
else
r->next = s;
r = s;
ch = getchar();
}
if (r != NULL)
r->next = NULL;
return head;
}
//查找——按照序号查找
//主函数
int main() {
linklist *f, *r;
printf("head insert:\n");
f=CREATLISTF();//头插法建立单链表
Print(f);//打印链表和链表的长度
printf("tail insert:\n");
r = CREATLISTR(); //尾插法
Print(r);
}
我之前真的有加,然后为了给你一个完整的代码,我又去掉了。我也不知道为什么我加的时候不行,现在 getchar()和fflush(stdin);都可以。。。
都是我的问题,多谢你如此耐心的解答,谢谢你~~~