坚持可持续 2018-04-02 11:14 采纳率: 0%
浏览 1638
已结题

数据结构C语言链表输入排序问题

题目:

持续输入 学号,姓名,地址

-1终止输入

再按照学号从小到大顺序输出

个人感觉问题可能出在31行到38行
插入在链表最前面的时候会出现问题,其他情况没有问题

测试 输入会错误的情况(插在开头):
3,sfdfs,sdfsfd
2,sdf,sdf,sfd
-1

测试 输入会正确的情况:
3,sdf,sd,sfd
5,fsd,sdf
4,dsf,sdf
-1

/////姓名和地址就乱打几个字符了。。。

下面是关于链的的数据的调试截图(输出_会错误的情况_,数据见上文 )

图片说明

直到输入 —1终止前 ,都是正确的(↑↑↑第一张调试图,排序也是对的)

但是终止后,就会无限输出开头的(↓↓↓最后输入的插到开头的那个数)

主链变成next永远指向自己的。

图片说明

虽然是用双链表写的,但是没什么关系。
个人感觉问题在出在指针返还值或者函数返还值上面,_步骤应该都是没有问题的_,调试了很多遍

 #define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef  struct node
{
    char    name[20];
    char    add[20];
    int nu;

    struct node *pre;
    struct node *next;
}Newnode;


Newnode sort( node *q, Newnode *inser )                                 /* sort+insert 找到位置插入 */
{
    Newnode *temp = q;


    while ( 1 )
    {
        if ( temp->next == NULL && temp->nu < inser->nu )       /* 插在尾的情况,插入数大于所有temp +  第一个数时插在后面 */
        {
            temp->next  = inser;
            inser->pre  = temp;
            return(*q);
        }


        if ( temp->pre == NULL && temp->nu > inser->nu )        /*  第一个数时插在前面 */
        {                                                       /*  printf("okOK"); */
            /*  temp->pre=inser; */
            inser->next = temp;

            return(*inser);
        }
    }
    inser->next = temp;
    inser->pre  = temp->pre;
    temp->pre->next = inser;
    temp->pre   = inser;

    return(*q);
}


Newnode add( Newnode *q )     //q就是主链的地址
{
    int count = 0;


    while ( 1 )
    {
        Newnode *newnode;
        newnode = (Newnode * ) malloc( sizeof(Newnode) );
        scanf( "%d,", &newnode->nu );
        if ( newnode->nu == -1 )
        {
            return(*q);
        }
        newnode->next   = NULL;
        newnode->pre    = NULL;
        scanf( "%[^,]%[^\n]", newnode->name, newnode->add );


        if ( q->pre == NULL && q->next == NULL && count == 0 )
        {
            q = newnode;
            count++;                        /* 第一个数的输入,只输入一次 */
            continue;
        }else
            *q = sort( q, newnode );        /* 从第二个数开始就插入,这里的指针传递对吗。。。 */
    }
    return(*q);
}


void printall( Newnode *q )
{
    Newnode *temp = q; /* temp当前指针 */
    printf( "%d %s %s\n", q->nu, q->name, q->add );
    temp = temp->next;
    /* printf("%d %s %s\n",temp->nu,temp->name,temp->add); */
    while ( temp != NULL )
    {
        printf( "%d %s %s\n", temp->nu, temp->name, temp->add );
        temp = temp->next;
    }
/*  printf("%d %s %s\n",temp->nu,temp->name,temp->add); */
}


/* ////////////////////// */

int main( void )
{
    char inpu; int inpu2;

    Newnode p;

    p.pre   = NULL; p.next = NULL;
    p   = add( &p );

    printall( &p );
}

第一个特别输入
其他 找到位置,然后插入,排序一个插入一个。
调试调试吧。
再次说一下,步骤应该是没有问题的。(除了插在开头的情况会出现错误)调试了很多数据了。感觉问题应该出在指针返还上面。

  • 写回答

2条回答

  • 有点贪玩 2018-04-03 04:26
    关注

    既然会调试,那就一个节点一个节点的跟代码
    这代码,。。->nu输入一个1,然后输入3,再输入2就死循环了

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题