题目:
持续输入 学号,姓名,地址
-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 );
}
第一个特别输入
其他 找到位置,然后插入,排序一个插入一个。
调试调试吧。
再次说一下,步骤应该是没有问题的。(除了插在开头的情况会出现错误)调试了很多数据了。感觉问题应该出在指针返还上面。