热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

单链表冒泡排序,请看看我的问题何在?

voidswap(structstudent*head,intlIndex,intrIndex){structstudent*lNodeget(lIndex,head);
void swap(struct student *head, int lIndex, int rIndex){
struct student *lNode = get(lIndex, head);
struct student *rNode = get(rIndex, head);
struct student *tmp = (struct student *)malloc(SIZE);
strcpy(tmp->name, lNode->name);
strcpy(tmp->no, lNode->no);
tmp->score = lNode->score;
strcpy(lNode->name, rNode->name);
strcpy(lNode->no, rNode->no);
lNode->score = rNode->score;
strcpy(rNode->name, tmp->name);
strcpy(rNode->no, tmp->no);
rNode->score = tmp->score;
}

void sort(struct student *head){
for(int i = 0; i < size(head); i++){
for(int j = 0; j < size(head) - i - 1; j++){
if((head+j)->score-(head+j+1)->score>0){
swap(head, j, j+1);
}
}
}
}

代码如上,单独测试swap功能可用。
调试时为什么(head+j)->score和(head+j+1)->score都是-4.3160208e+008,而输出又是正常?
为什么struct student有name成员,调试时看不见?一头雾水啊

16 个解决方案

#1


看来人帮我看看啊,自己搞不定了啊。

#2


等的我菊花都快谢了。还是先换个思路把,我去试试交换指针

#3


再顶一记。先去干干工作,一会回来看。不要让LZ失望啊

#4


这个调试的问题 难道要远程?

#5


引用 4 楼 zhuankeshumo 的回复:
这个调试的问题 难道要远程?

#include 
#include 
#include 

#define SIZE sizeof(struct student)

struct student
{
char name[20];
char no[8];
float score;
struct student *next;
};

struct student *create(){
struct student *p1,*p2,*head;
int count = 0;
p1 = p2 = head = (struct student *)malloc(SIZE);
scanf("%s%s%f", &p1->name, &p1->no,&p1->score);
while(strcmp(p1->no, "0")!=0){
if(count!=0){
p2->next=p1;
p2=p1;
}
p1=(struct student *)malloc(SIZE);
scanf("%s%s%f", &p1->name, &p1->no,&p1->score);
++count;
}
p2->next = NULL;
return count == 0?NULL:head;
}

void output(struct student *head){
struct student *p = head;
while(p!=NULL){
printf("%s %s:%3.1f\n", p->name, p->no, p->score);
p=p->next;
}
}

int search(char *no, struct student *head){
struct student *p = head;
int count = 0;
while(p!=NULL){
if(strcmp(p->no, no)==0){
break;
}
p=p->next;
++count;
}
return count;
}

void removeAtIndex(int index, struct student *head){
struct student *p = head;
for(int i = 0; i < index-1; i++){
p = p->next;
}
p->next = p->next->next;
}

struct student *get(int index, struct student *head){
struct student *p = head;
return p+index;
}

int menu(){
printf("\t\t\t*********************************\n");
printf("\t\t\t*            1.Input            *\n");
printf("\t\t\t*            2.Output           *\n");
printf("\t\t\t*            3.Sort             *\n");
printf("\t\t\t*            4.Insert           *\n");
printf("\t\t\t*            5.Delete           *\n");
printf("\t\t\t*            6.Modify           *\n");
printf("\t\t\t*            7.Quit             *\n");
printf("\t\t\t*********************************\n");
int choice;
scanf("%d",&choice);
return choice;
}

int size(struct student *head){
struct student *p = head;
int count = 0;
while(p!=NULL){
++count;
p = p->next;
}
return count;
}

void swap(struct student *head, int lIndex, int rIndex){
struct student *lNode = get(lIndex, head);
struct student *rNode = get(rIndex, head);
struct student *tmp = (struct student *)malloc(SIZE);
strcpy(tmp->name, lNode->name);
strcpy(tmp->no, lNode->no);
tmp->score = lNode->score;
strcpy(lNode->name, rNode->name);
strcpy(lNode->no, rNode->no);
lNode->score = rNode->score;
strcpy(rNode->name, tmp->name);
strcpy(rNode->no, tmp->no);
rNode->score = tmp->score;
}

void sort(struct student *head){
for(int i = 0; i < size(head); i++){
for(int j = 0; j < size(head) - i - 1; j++){
if((head+j)->score-(head+j+1)->score>0){
swap(head, j, j+1);
}
}
}
}

void main()
{
struct student *head;
int choice;
while(true){
switch(choice=menu()){
case 1:
head = create();
break;
case 2:
output(head);
break;
case 3:
sort(head);
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
return;
break;
default:
printf("invilid input!\n");
break;
}

}
}

完整代码。本来不想贴出来丢人的

#6


你用什么调试的

#7


引用 6 楼 buyong 的回复:
你用什么调试的

vs2010

#8


楼主用的是链表, get和sort却用的是数组方式啊。

#9


引用 8 楼 mymtom 的回复:
楼主用的是链表, get和sort却用的是数组方式啊。

没思路啊,求大神提供思路。sort倒是有个思路,就是更改节点的位置,但是比这个复杂,涉及到表头和表尾,我就先这么写了。

#10


代码如上,单独测试swap功能可用。
调试时为什么(head+j)->score和(head+j+1)->score都是-4.3160208e+008,而输出又是正常?
为什么struct student有name成员,调试时看不见?一头雾水啊


scanf("%s%s%f", &p1->name, &p1->no,&p1->score); 不能区分输入的字串是p1->name or p1->no的,得该

#11


重点是sort和get函数里的改动

#include 
#include 
#include 
 
#define SIZE sizeof(struct student)
 
struct student
{
    char name[20];
    char no[8];
    float score;
    struct student *next;
};
 
struct student *create(void){
    struct student *p1,*p2,*head;
    int count = 0;
    p1 = p2 = head = (struct student *)malloc(SIZE);
    // scanf("%s%s%f", &p1->name, &p1->no,&p1->score);
    scanf("%s%s%f", p1->name, p1->no,&p1->score);
    while(strcmp(p1->no, "0")!=0){
        if(count!=0){
            p2->next=p1;
            p2=p1;
        }
        p1=(struct student *)malloc(SIZE);
        // scanf("%s%s%f", &p1->name, &p1->no,&p1->score);
        scanf("%s%s%f", p1->name, p1->no,&p1->score);
        ++count;
    }
    p2->next = NULL;
    return count == 0?NULL:head;
}
 
void output(struct student *head){
    struct student *p = head;
    while(p!=NULL){
        printf("%s %s:%3.1f\n", p->name, p->no, p->score);
        p=p->next;
    }
}
 
int search(char *no, struct student *head){
    struct student *p = head;
    int count = 0;
    while(p!=NULL){
        if(strcmp(p->no, no)==0){
            break;
        }
        p=p->next;
        ++count;
    }
    return count;
}
 
void removeAtIndex(int index, struct student *head){
    struct student *p = head;
    for(int i = 0; i < index-1; i++){
        p = p->next;
    }
    p->next = p->next->next;
}
 
struct student *get(int index, struct student *head){
    struct student *p = head;
    // return p+index;
    while (index--)
        p = p->next;
    return p;
}
 
int menu(void){
    printf("\t\t\t*********************************\n");
    printf("\t\t\t*            1.Input            *\n");
    printf("\t\t\t*            2.Output           *\n");
    printf("\t\t\t*            3.Sort             *\n");
    printf("\t\t\t*            4.Insert           *\n");
    printf("\t\t\t*            5.Delete           *\n");
    printf("\t\t\t*            6.Modify           *\n");
    printf("\t\t\t*            7.Quit             *\n");
    printf("\t\t\t*********************************\n");
    int choice;
    scanf("%d",&choice);
    return choice;
}
 
int size(struct student *head){
    struct student *p = head;
    int count = 0;
    while(p!=NULL){
        ++count;
        p = p->next;
    }
    return count;
}
 
void swap(struct student *head, int lIndex, int rIndex){
    struct student *lNode = get(lIndex, head);
    struct student *rNode = get(rIndex, head);
    struct student *tmp = (struct student *)malloc(SIZE);
    strcpy(tmp->name, lNode->name);
    strcpy(tmp->no, lNode->no);
    tmp->score = lNode->score;
    strcpy(lNode->name, rNode->name);
    strcpy(lNode->no, rNode->no);
    lNode->score = rNode->score;
    strcpy(rNode->name, tmp->name);
    strcpy(rNode->no, tmp->no);
    rNode->score = tmp->score;
}
 
void sort(struct student *head){
    for(int i = 0; i < size(head); i++){
        for(int j = 0; j < size(head) - i - 1; j++){
            // if((head+j)->score-(head+j+1)->score>0){
            if(get(j, head)->score-get(j+1, head)->score>0){
                swap(head, j, j+1);
            }
        }
    }
}
 
int main(void)
{
    struct student *head;
    int choice;
    while(1){
        switch(choice=menu()){
        case 1:
            head = create();
            break;
        case 2:
            output(head);
            break;
        case 3:
            sort(head);
            break;
        case 4:
            break;
        case 5:
            break;
        case 6:
            break;
        case 7:
            return 0;
            break;
        default:
            printf("invilid input!\n");
            break;
        }
         
    }
    return 0;
}

#12


总的来说楼主的程序思路还是比较清晰的!

#13


引用 12 楼 mymtom 的回复:
总的来说楼主的程序思路还是比较清晰的!


多谢多谢。我知道问题所在了,链表的内存空间不是连续的,所以数组方式就错了。昨天就犯过一次,今天又忘了

#14


(head+j)
(head+j)->score
要放到watch窗口察看。

#15


引用 11 楼 mymtom 的回复:
重点是sort和get函数里的改动
C/C++ code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283……

版主大人,小的还有问题要问。
// scanf("%s%s%f", &p1->name, &p1->no,&p1->score);
        scanf("%s%s%f", p1->name, p1->no,&p1->score);

为什么这两句效果一样啊?用&p1->name为什么输入内容还是保存到了name里面呢

#16


scanf("%s%s%f", &p1->name, &p1->no,&p1->score);
scanf("%s%s%f", p1->name, p1->no,&p1->score);
第二个的才正确,%s 需要 char *参数

p1->name 类型是 pointer to char
&p1->name 类型是 pointer to array of 20 chars
当然在数值上两者是相同的。


原因在scanf的说明里有
     s     Matches a sequence of non-white-space characters; the next pointer
           must be a pointer to char, and the array must be large enough to
           accept all the sequence and the terminating NUL character.  The
           input string stops at white space or at the maximum field width,
           whichever occurs first.

推荐阅读
  • 本打算教一步步实现koa-router,因为要解释的太多了,所以先简化成mini版本,从实现部分功能到阅读源码,希望能让你好理解一些。希望你之前有读过koa源码,没有的话,给你链接 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • c语言二元插值,二维线性插值c语言
    c语言二元插值,二维线性插值c语言 ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • 本文介绍如何手动实现一个字符串连接函数,该函数不依赖于C语言的标准字符串处理函数,如strcpy或strcat。函数原型为void concatenate(char *dest, char *src),其主要作用是将源字符串src追加到目标字符串dest的末尾。 ... [详细]
  • linux网络子系统分析(二)—— 协议栈分层框架的建立
    目录一、综述二、INET的初始化2.1INET接口注册2.2抽象实体的建立2.3代码细节分析2.3.1socket参数三、其他协议3.1PF_PACKET3.2P ... [详细]
  • Logging all MySQL queries into the Slow Log
    MySQLoptionallylogsslowqueriesintotheSlowQueryLog–orjustSlowLog,asfriendscallit.However,Thereareseveralreasonstologallqueries.Thislistisnotexhaustive:Belowyoucanfindthevariablestochange,astheyshouldbewritteninth ... [详细]
  • 本文详细介绍了Elasticsearch中的分页查询机制,包括基本的分页查询流程、'from-size'浅分页与'scroll'深分页的区别及应用场景,以及两者在性能上的对比。 ... [详细]
  • 本文详细介绍了如何在循环双链表的指定位置插入新元素的方法,包括必要的步骤和代码示例。 ... [详细]
  • 编译原理中的语法分析方法探讨
    本文探讨了在编译原理课程中遇到的复杂文法问题,特别是当使用SLR(1)文法时遇到的多重规约与移进冲突。文章讨论了可能的解决策略,包括递归下降解析、运算符优先级解析等,并提供了相关示例。 ... [详细]
  • 现在越来越多的人使用IntelliJIDEA,你是否想要一个好看的IDEA主题呢?本篇博客教你如何设置一个美美哒IDEA主题,你也可以根据 ... [详细]
  • 字符串中特定模式出现次数的计算方法
    本文详细探讨了如何高效地计算字符串中特定模式(如'pat')的出现次数,通过实例分析与算法解析,帮助读者掌握解决此类问题的方法。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 本文提供了一个使用C语言实现的顺序表区间元素删除功能的完整代码示例。该程序首先初始化一个顺序表,然后根据用户输入的数据进行插入操作,最后根据指定的区间范围删除相应的元素,并输出最终的顺序表。 ... [详细]
  • 本题要求实现一个高效的算法,在一个 m x n 的矩阵中搜索目标值 target。该矩阵具有以下特性:每行的元素从左到右按升序排列,每列的元素从上到下按升序排列。 ... [详细]
author-avatar
oooooo1995_395
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有