标题:单链表的打印函数无法跳出
只看楼主
gui在坚持
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-9-9
结帖率:0
 问题点数:0 回复次数:1 
单链表的打印函数无法跳出
这是我自己写的一个单链表,但是打印函数出了问题,是一个死循环出不来,检查了很久也没看出来。有哪位大佬能帮我找找茬。
代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct num{
int a;
struct num* next;
}Num;

typedef struct node{
int sum;
struct num* fir;
struct num* end;
}Node;

Node* init_struct(void)
{
    Node *p=NULL;
    p=(Node *)malloc(sizeof(Node));
    p->sum=0;
    p->fir=NULL;
    p->end=NULL;
    return p;
}

Node* add_Node(int su,Node *k)
{
    Node *p=k;
    Num *n=NULL;
    n=(Num *)malloc(sizeof(Num));
    n->a=su;
    (p->sum)++;
    if(p->fir==NULL)                //插链表的第一个元素
    {
        printf("插入链表成功\n");
        p->fir=n;
        p->end=n;
        p->fir->next=p->end;
        p->end->next=NULL;
        return p;
    }
    if(p->sum==2)
    {
        if((n->a)>=(p->fir->a))     //插头
        {
            p->fir->next=n;        //P的下一个
            p->end=n;
            p->end=NULL;
        }
        else                        //插尾
        {
            p->fir=n;
            p->fir->next=p->end;
        }
        printf("插入链表成功????????\n");
        return p;
    }
    Num *pre=p->fir;
    Num *pro=pre;
    while(((n->a)>=(pre->a))&&(pre!=NULL))    //寻找插入位置
    {
        pro=pre;
        pre=pre->next;
    }
    if(pre==(p->fir))    //插头
    {
        n->next=p->fir;
        p->fir=n;
    }
    else if(pre==NULL)   //插尾
    {
        p->end->next=n;
        p->end=n;
        n->next=NULL;
    }
    else      //插中间
    {
        pro->next=n;
        n->next=pre;
    }
    printf("插入链表成功!!!!!\n");
    return p;
}
int print_list(Node *p)
{
    Num *pre=p->fir;
    if(pre==NULL)
    {
        printf("链表什么都没有\n");
        return 1;
    }
    while(1)
    {
        if(pre==NULL)
        break;
        printf("出不来");
        printf("%d\n",pre->a);
        pre=pre->next;
    }
    printf("\n");
    printf("该链表有%d个元素\n",p->sum);
    return 0;
}
int main()
{
    Node* p;
    int n;
    p=init_struct();
    while(1)
    {
        scanf("%d",&n);
        if(n==-1)
        break;
        p=add_Node(n,p);
        //getchar();
    }
    print_list(p);
    free(p);
    p=NULL;
    return 0;
}
搜索更多相关主题的帖子: next Node num NULL printf 
2020-03-05 02:01
gui在坚持
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-9-9
得分:0 
找出来了,在寻找插入位置的时候,while(((n->a)>=(pre->a))&&(pre!=NULL)) 如果是插尾的话,pre->a指向的内容不知道是什么,一次将两个条件换一下顺序就行了,while((pre!=NULL)&&((n->a)>=(pre->a)))。
2020-03-05 10:29



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-499561-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.311228 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved