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

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

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

    图片说明

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
  • ¥15 onvif+openssl,vs2022编译openssl64
  • ¥15 iOS 自定义输入法-第三方输入法
  • ¥15 很想要一个很好的答案或提示
  • ¥15 扫描项目中发现AndroidOS.Agent、Android/SmsThief.LI!tr
  • ¥15 怀疑手机被监控,请问怎么解决和防止
  • ¥15 Qt下使用tcp获取数据的详细操作
  • ¥15 idea右下角设置编码是灰色的
  • ¥15 全志H618ROM新增分区
  • ¥15 在grasshopper里DrawViewportWires更改预览后,禁用电池仍然显示