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

题目:

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

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

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

1

3个回答

错误有两点:
1是你的sort函数本身排序算法有问题
2.在add函数中你用你sort函数返回一个链表节点赋值给了一个已经在你链表中排序过的节点,造成本身有序的链表又无序了。
改了一下
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
typedef struct node
{
char name[20];
char add[20];
int nu;

struct node *pre;
struct node *next;

}Newnode;

Newnode sort( Newnode *q, Newnode *inser )

{
Newnode *temp = q;

while ( 1 )
{
    if(temp->nu == inser->nu){
        printf("error:duplicate num\n");
        exit(0);
    }
    if ( temp->next == NULL && temp->nu < inser->nu )      
    {
        temp->next  = inser;
        inser->pre  = temp;
        return(*q);
    }

    if ( temp->pre == NULL && temp->nu > inser->nu )        
    {                                                       
        /*  temp->pre=inser; */
        inser->next = temp;

        return(*inser);
    }
    if ( temp->pre != NULL && temp->nu > inser->nu )        
            {                                                    
                temp->pre->next=inser;
                inser->next=temp;
                inser->pre =temp->pre;
                temp->pre=inser;
                return(*q);
            }
    if ( temp->next != NULL && temp->nu < inser->nu )        
            {                                                      

                temp=temp->next;
            }
}

}

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->next= newnode;
        count++;
        continue;
    }else
        q->next = sort( q->next, 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.next );

}

0

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

}

这里的continue,语句的话好像是用break。continue是跳出本次循环,执行下一次循环。这里感觉你应该是要跳出整个循环体,而不是一次循环,break就是用于跳出循环体。

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

}
这里的话while死循环包裹了上面,也没有跳出语句下面:
inser->next = temp;
inser->pre = temp->pre;
temp->pre->next = inser;
temp->pre = inser;

return(*q);

这几句估计不会执行,输入两个前插或者两个后插 估计就会死循环吧。

我也不是高手,说错请谅解,谢谢!!

-1

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

-1
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C语言实现的顺序链表代码
      数据结构上机考试练习代码,置于此以备后用!        #include&amp;lt;stdio.h&amp;gt; #define ListSize 100 //定义顺序表存放的数据类型 typedef int DataType; //定义顺序表的结构 typedef struct{ //用于存放元素的数组 DataType data[ListSize]; ...
单链表的应用:用C语言实现简单的员工管理系统(新建、增、删、改、查、排序)
/* 问题描述:每个员工的信息包括:编号、姓名、性别、出生年月、学历、职务、电话、住址等。系统能够完成员工信息的查询、更新、插入、删除、排序等功能。 基本要求:排序:按不同关键字,对所有员工的信息进行排序;查询:按特定条件查找员工;更新,按编号对某个员工的某项信息进行修改;插入,加入新员工的信息;删除,按编号删除已离职的员工的信息。 选作内容:实现图形用户界面。 通过链表实现 数据结构: stru...
数据结构与算法(排序)——直接插入排序
直接插入排序是一种最简单的排序算法,因此又称简单插入排序 思想:第i趟排序将序列中的第i+1个元素 k(i+1)插入到一个已经生成的子序列中合适的位置,使得插入的序列仍然保持有序。(不理解的就想打扑克牌时候手中码牌的顺序和方法)   例子:{3,6,4, 2,11,10,6}     实例代码:实现{2,5,6,3,7,8,0,9,12,1}的直接插入排序,要求从大到小排序   ...
数据结构—单链表—直接插入排序
有一个带头节点的单链表L(至少有一个数据节点),设计一个程序使其元素呈递增有序排列 。 思路: 先构造一个只含有一个数据节点的有序表。然后扫描单链表L余下的节点*p(直到p为NULL为止),在有序表中通过比较找插入*p节点的前驱节点*pre,然后在*pre节点之后插入*p节点。 #include &lt;iostream&gt; using namespace std; #i...
2014.3单链表:输入5个数,使用单链表连接,然后有小到大排序输出。
//单链表:输入5个数,使用单链表连接,然后有小到大排序输出。 #include&amp;lt;iostream&amp;gt; #include&amp;lt;algorithm&amp;gt; using namespace std; typedef struct node { int data; node* next; }node; int main() { node* a[5]; ...
数据结构之单链表的冒泡排序
#include#includetypedef struct Node{ int data; struct Node *next;}List;List *Creat(){ int i,n; scanf("%d",&n); List *head,*p1,*p2; p1=p2=(List *)malloc(sizeof(List)); head=NULL;
对一个链表进行插入排序
class ListNode { int val; ListNode next; ListNode(int x) { val = x; next = null; } } public class Solution { public ListNode insertionSortList(Li...
C语言:用单链表实现输入排序
纯当练习 链表头结点存储的信息是链表长度 平台VS2015 #include<stdio.h> #include<stdlib.h> #include<time.h> struct ListNode { int val; struct ListNode *next; }; void createList(struct ListNode* list, int listsSi
边插入边排序
#include int main() { int a[99]; int data; scanf("%d",&data); int count=0; a[count++]=data; while(~scanf("%d",&data)) { printf("\n"); a[count++]=data;
算法-合并两个排序的链表
题目: 输入两个递增排序的链表,合并着两个链表并使新链表中的结点仍然是按照递增顺序的。例如输入的链表1和链表2如下,合并后的为链表3。链表的结点定义如下: struct ListNode { int value; ListNode *next; }; 解题思路: 首先可以确定的是,链表1和链表2本身就是递增的,所以合并的过程可以从链表1,2的头结点开始,先比较1,2的头结点
C语言 简单链表创建 排序 输出
#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;malloc.h&amp;gt;//为动态分配提供函数库 typedef struct node { int num;//数据域 struct node *next;//后继指针 }node; void create();//创建链表 void sort();//排序 void print();//输出 node *head = ...
【数据结构】c语言链表实现报数问题
#include<stdio.h> #include<malloc.h> void main() { int i,j, k,n,m; struct baoshu { int number; struct baoshu *next; }*p,*q,*head,*temp; printf("输入人数"); scanf("%d
数据结构(双向链表)(C语言)
利用C语言实现双向链表的基本功能: 头文件: //LinkList.c #ifndef _LINKLIST_H #define _LINKLIST_H #define SUCCESS 10000 #define FAILURE 10001 #define TRUE 10002 #define FALSE 10003 typedef int Elemtype; typedef s...
数据结构与算法之有序链表去重
1. 有序链表,需要将链表中重复的节点合并为一个节点(例如:[1,2,3,3,3,5,7,8,8,9,13,14]) 合并为[1,2,3,5,7,8,9,13,14]) struct ListNode { int val; ListNode* next; } ListNode* uniq_list(ListNode* head) { if(head == Null || head ->
C语言实现链表数据顺序输入输出
C语言实现链表数据顺序输入输出 构建一个链表,用于存放用户输入的数据,一个数据为一个节点,按照输入的先后顺序加到链表中。当用户输入0时结束输入并按输入先后顺序输出数据。 具体实现代码如下: #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; struct node{ int n; struct node *pNext; ...
《数据结构》进行曲 之 单链表实现学生信息管理系统
#include #include using namespace std; #define MAX 100 typedef struct STU{ char name[20]; char sno[20]; int age; float score; }Student; typedef struct LNode{ Student data; struct LNode *next;
数据结构C语言版线性链表的12个基本操作
线性链表的12个基本操作 分别是:构造 销毁 清空      判空  表长 取元      定位  前驱 后继      插入 遍历;在此为了好记我分别二字短语三三结合 ,接下来会一一解释。 头文件和宏定义 #include #include #include #include using namespace std; #define  TURE     1 #define  FA
数据结构——链表(5)数组转换为链表&&单链表冒泡排序
1.数组转换为链表结构,主要思想可以按照头插法或尾插法,要手动生成一个新的结点,分配存储空间,然后按照顺序,将数组中对应的元素放在链表对应的数据区。 /* 用数组创建链表 */ Linklist ArrayToList(int *arr,int len) { Linklist head=NULL; int data; Linklist pCurrent...
C语言 链表 数据结构实验之链表一:顺序建立链表
数据结构实验之链表一:顺序建立链表 Problem Description 输入N个整数,按照输入的顺序建立单链表存储,并遍历所建立的单链表,输出这些数据。 Input 第一行输入整数的个数N; 第二行依次输入每个整数。 Output 输出这组整数。 Example Input 8 12 56 4 6 55 15 33 62 Exampl
数据结构--链表、二叉树、排序算法
链表(线性) 概念 一种存储结构,每一个数据元素 ai 都有两个部分组成:存储本身信息的数据域和一个存储其后继信息的指针域(组成一个结点);指针域中存储的信息称为指针或链。n个结点链结成一个链表(线性链表)。 整个链表的存取必须从一个头指针开始进行,头指针指向链表的第一个结点的存储位置,由于最后一个数据元素没有直接后续,所以链表的最后一个结点的指针为空(null)。 链表的插入 链表的...
C语言 链表实现 学生成绩排名
题    源 本题来自于牛客网: https://www.nowcoder.com/practice/0383714a1bb749499050d2e0610418b1?tpId=40&amp;amp;tqId=21333&amp;amp;tPage=1&amp;amp;rp=1&amp;amp;ru=/ta/kaoyan&amp;amp;qru=/ta/kaoyan/question-ranking   题 目 描 述 查找和...
C语言链表排序操作
链表创建、排序操作
数据结构:单链表(逆序)
1 .单链表的逆序操作是链表中的一个重要操作,也是面试中不可缺少的一个环节,几乎许多涉及到链表的面试题中都会提到如何将一个链表进行逆序的操作考点;下面采用“迭代循环”的方式来实现将一个链表进行逆序,如链表中原来的各节点值分别为:A B C D E 逆序后打印为:E D C B A----------------------------------
链表箱子排序问题
箱子排序 1,逐个删除输入链表的节点,把删除节点分配到相应的箱子里 2,把每个箱子中的链表收集并连接起来,使其成为一个有序链表 (即连续删除链表首元素,并将其插入某个箱子的链表首位,然后从最后一个箱子开始,逐个删除每个箱子的首元素,并将其插入一个链表为空的链表首位)void binSort(chain<studentRecord> &thechain, int range) {
数据结构 C语言实现直接插入排序
一、直接插入排序简介 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。 第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。二、C语言代码实现#include <stdio.h> /* 将两个数据交换 */ void swap(in
数组和链表的归并排序算法实现(C语言)
数组和链表的归并排序算法实现(C语言)
数据结构--单链表的基本操作(C语言实现)
数据结构--单链表的基本操作(C语言实现)     #include #include #define ERROR 0 #define OK   1 typedef int status; typedef int ElemType; typedef struct Node {  ElemType data;  struct Node
用链表储存学生信息然后排序输出
题目:4.建立一个链表,每个结点包括:学号,姓名,年龄,性别。要求输入3个人的信息,将他们按照年龄正序/逆序排序输出他们的信息。 下面是代码: 结构体模块: typedef struct Student{ long num; char name[8]; int age; char sex[5]; Student *next; }stu; 初始化模块 void init(stu **p...
C语言实现数据从小到大加入链表并输出
C语言实现数据从小到大加入链表并输出 构建一个链表,用于存放用户输入的数据,一个数据为一个节点,按照输入的数据从小到大顺序插入到链表中,当用户输入0时结束输入并按照从小到大的顺序输出数据。 具体代码实现如下: #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; struct node { int n; struct no...
C语言学生信息管理系统 (单链表版)
//以单链表作为存储结构,设计和实现课程成绩管理的完整程序。程序包括如下功能。 //1.建立学生成绩表,包含学生的学号、姓名和成绩。 //2.可以显示所有学生成绩。 //3.可以计算学生的总数。 //4.可以按学号和序号查找学生。 //5.可以在指定位置插入学生成绩数据。 //6.可以删除指定位置的学生数据。 //7.可以把学生成绩按从高到低的顺序排序。 //操作系统:Mac OS X //编译
建立一个成绩按降序排列的链表
/***************************************************** copyright (C), 2014-2015, Lighting Studio. Co.,     Ltd.  File name: Author:fhb    Version:0.1    Date:  Description: Funcion List: 五、编写程序
算法与数据结构-单向链表的直接插入排序和快速排序
单向链表,直接插入排序,快速排序
问题 B: C语言-链表排序
题目描述 已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。 输入 第一行,a、b两个链表元素的数量N、M,用空格隔开。 接下来N行是a的数据 然后M行是b的数据 每行数据由学号和成绩两部分组成 输出 按照学号升序排列的数据 样例输入 2 3 5 100 6 89 3 82 4 95 2 10 样例输出 2 10 3 82 4 95 5 ...
一个基于C的简单的使用链表的成绩排序程序
有多个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入这几个学生的成绩,要求输出3门课程的总平均成绩,以及最高分学生的数据。
数据结构学习笔记——线性表之单链表(c语言实现)
1.概念 链式存储结构:是指把数据元素存放在任意内存未被占用的存储单元里,这组存储单元可以是连续的,也可以是不连续的。 大概就是这样: 因此,为了表示每个数据元素a1,与其直接后继数据元素 a2 之间的逻辑关系,对数据元素a来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。 对此有如下几个概念: 数据域 指针域 指针(链) 头指针 存储数据...
实现两个链表的合并(数据结构课程设计c语言版)
实现两个链表的合并(数据结构课程设计c语言版)
C语言-数据结构-单链表倒置
/*#include #include //单链表倒置 typedef struct node {     int data;     struct node *next; }body; body *table() {     int i,a;     body *head,*p1,*p2;     head=NULL;     for(i=0;;i++)    
删除链表中重复元素(c语言版)
输入一组数字,换行,输入要删除的元素,输出删除后的元素和元素个数。若输入字母,浮点型数据可判错。
数据结构--动态链表(单链表)的元素增删改查操作及C语言实现
1.动态链表的插入操作 #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; //结构体实现自定义: typedef struct Link { int elem;//代表数据域 struct Link * next;//代表指针域,指向直接后记元素 }link; //初始化链表 link * initLink(); link * ini...
数据结构(链表初始化和常见操作)
链表的初始化 创建一个链表需要做如下工作: 1.声明一个头指针(如果有必要,可以声明一个头节点); 2.创建多个存储数据的节点,在创建的过程中,要随时与其前驱节点建立逻辑关系; 比如创建一个存储{1,2,3}且无头结点的链表,C语言实现代码如下 link * initLink(){ link * p=NULL;//创建头指针 link * ...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java 链表学习 链表学习java