柏树林的
2016-04-07 10:27
采纳率: 68.8%
浏览 2.9k
已采纳

单链表的头插法和尾插法,用同一个方法求长度。。。。

 #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);

}

=============调用头插法和尾插法,右边是输出结果============================
调用头插法和尾插法
==============只是调用尾插法,右边是输出结果==============================

只是调用尾插法

在主函数中先是调用头插法再调用尾插法。但是尾插法输出的长度多了一个。如果只是在调用尾插法,长度就正常输出了。这到底是什么原因??

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • 小灸舞 2016-04-18 01:51
    已采纳

    楼主你到底有没有加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);
    
    }
    

    图片说明

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • 小灸舞 2016-04-07 11:30

    因为先调用完头插法(楼主是以#来判断读入结束的,那么就导致最后输入缓冲区里会遗留一个回车符)
    再调用尾插法的时候,首先插入的节点就是\n,所以楼主打印的时候没有发现吗,多了一个空行和一个空格
    (所以第二种,直接调用尾插法是正确的,不存在这个遗留的回车)
    所以在两者之间加一个fflush(stdin);或者getchar()清楚掉回车符就好了

    评论
    解决 无用
    打赏 举报
  • 柏树林的 2016-04-18 01:26

    #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);

    }

    
    
    评论
    解决 无用
    打赏 举报
  • 柏树林的 2016-04-18 06:37

    我之前真的有加,然后为了给你一个完整的代码,我又去掉了。我也不知道为什么我加的时候不行,现在 getchar()和fflush(stdin);都可以。。。
    都是我的问题,多谢你如此耐心的解答,谢谢你~~~

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题