鱼C论坛

 找回密码
 立即注册
查看: 1177|回复: 6

有关链表的一个问题

[复制链接]
发表于 2020-5-25 20:25:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
可以直接看第44行的位置。不明白为什么第二种就输出不了
第一种
#include <stdio.h>
#include <string.h>
#include <stdlib.h> 
struct book                                                //书籍信息的结构
{        
        int book_id;                                
        char book_name[30];       //一个书的id、一个书名、5个关键字、3个作者、一个发布地、一个发布时间 
        char keyword1[30];
        char keyword2[30];
        char keyword3[30];
        char keyword4[30];
        char keyword5[30];
        char author1[30];
        char author2[30];
        char author3[30];
        char publisher[30];
        char publish_time[30];
        struct book *next;
}*Book;

struct book *data_book_sort(struct book *head);
struct book *exchange(struct book *p);    //交换p的右边与p右边的右边的结点 
struct book *data_book_input();        //将数据库数据导出到一个结构指针上

void main()
{
        struct book *head;
        head = data_book_input();                                        //head是头指针 
        head = data_book_sort(head);
        printf("%d\n",head->book_id);                                //这里是测试用 
        printf("%s\n",head->book_name);
        head = head->next;
        printf("%d\n",head->book_id);
        printf("%s\n",head->book_name);
} 
struct book *data_book_sort(struct book *head)                        
{
        struct book *p, *q;
        p = (struct book *)malloc(sizeof(struct book));
        q = (struct book *)malloc(sizeof(struct book));
        q->next = head;
        head = q;                                                //建立一个空的头结点插入到链表头里 
        p = q = head;
        while(q->next != NULL)                                
        {        
                p = head;
                while(p->next->next != NULL)                //不断循环,把最大的放到最后 
                {
                        if(p->next->book_id > p->next->next->book_id)                        //从小到大排序 
                                exchange(p);
                        p = p->next;
                }
                q = q->next;
        }
        head = head->next;
        return head;
}
struct book *exchange(struct book *p)   //交换p后面两个结点顺序 
{
        struct book *t;
        t = p->next;
        p->next = t->next;
        t->next = p->next->next;
        p->next->next = t;
} 
struct book *data_book_input()                //将数据库数据导出到一个结构指针上 
{        
        struct book *p,*head,*tail;
        head = tail = NULL;
        int book_id;
        char book_name[30];
        char keyword1[30];
        char keyword2[30];
        char keyword3[30];
        char keyword4[30];
        char keyword5[30];
        char author1[30];
        char author2[30];
        char author3[30];
        char publisher[30];
        char publish_time[30];
        FILE *f = NULL;
        if((f=fopen("data_book.txt","r")) == NULL)
        {
                printf("File is Error! No1\n");
                return NULL;
        }
        while(fscanf(f, "%d %s %s %s %s %s %s %s %s %s %s %s",
                &book_id,book_name,keyword1,keyword2,keyword3,keyword4,keyword5,
                author1,author2,author3,publisher,publish_time) != EOF)
        {
        if((p = (struct book *)malloc(sizeof(struct book)))==NULL)                //分配储存空间 
                {        
                        printf("Error!");
                        return NULL;
                }
                p->book_id = book_id;                                        //导入数据 
                strcpy(p->book_name , book_name);
                strcpy(p->keyword1 , keyword1);
                strcpy(p->keyword2 , keyword2);
                strcpy(p->keyword3 , keyword3);
                strcpy(p->keyword4 , keyword4);
                strcpy(p->keyword5 , keyword5);
                strcpy(p->author1 , author1);
                strcpy(p->author2 , author2);
                strcpy(p->author3 , author3);
                strcpy(p->publisher , publisher);
                strcpy(p->publish_time , publish_time);
                p->next = NULL;        //顺序建立链表 
                if(head == NULL)
            head = p;
            else
            tail->next = p;
            tail = p;
        }                        //链表头地址是head,最后的next是NULL
        fclose(f);
        return head;        //返回头指针 
}
第二种
#include <stdio.h>
#include <string.h>
#include <stdlib.h> 
struct book                                                //书籍信息的结构
{        
        int book_id;                                
        char book_name[30];       //一个书的id、一个书名、5个关键字、3个作者、一个发布地、一个发布时间 
        char keyword1[30];
        char keyword2[30];
        char keyword3[30];
        char keyword4[30];
        char keyword5[30];
        char author1[30];
        char author2[30];
        char author3[30];
        char publisher[30];
        char publish_time[30];
        struct book *next;
}*Book;

struct book *data_book_sort(struct book *head);
struct book *exchange(struct book *p);    //交换p的右边与p右边的右边的结点 
struct book *data_book_input();        //将数据库数据导出到一个结构指针上

void main()
{
        struct book *head;
        head = data_book_input();                                        //head是头指针 
        head = data_book_sort(head);
        printf("%d\n",head->book_id);                                //这里是测试用 
        printf("%s\n",head->book_name);
        head = head->next;
        printf("%d\n",head->book_id);
        printf("%s\n",head->book_name);
} 
struct book *data_book_sort(struct book *head)                        
{
        struct book *p, *q;
        p = (struct book *)malloc(sizeof(struct book));
        q = (struct book *)malloc(sizeof(struct book));
        q->next = head;
        head = q;                                                //建立一个空的头结点插入到链表头里 
        p = q = head;
        while(q->next->next != NULL)                                
        {        
                p = head;
                while(p->next->next != NULL)                //不断循环,把最大的放到最后 
                {
                        if(p->next->book_id > p->next->next->book_id)                        //从小到大排序 
                                exchange(p);
                        p = p->next;
                }
                q = q->next;
        }
        head = head->next;
        return head;
}
struct book *exchange(struct book *p)   //交换p后面两个结点顺序 
{
        struct book *t;
        t = p->next;
        p->next = t->next;
        t->next = p->next->next;
        p->next->next = t;
} 
struct book *data_book_input()                //将数据库数据导出到一个结构指针上 
{        
        struct book *p,*head,*tail;
        head = tail = NULL;
        int book_id;
        char book_name[30];
        char keyword1[30];
        char keyword2[30];
        char keyword3[30];
        char keyword4[30];
        char keyword5[30];
        char author1[30];
        char author2[30];
        char author3[30];
        char publisher[30];
        char publish_time[30];
        FILE *f = NULL;
        if((f=fopen("data_book.txt","r")) == NULL)
        {
                printf("File is Error! No1\n");
                return NULL;
        }
        while(fscanf(f, "%d %s %s %s %s %s %s %s %s %s %s %s",
                &book_id,book_name,keyword1,keyword2,keyword3,keyword4,keyword5,
                author1,author2,author3,publisher,publish_time) != EOF)
        {
        if((p = (struct book *)malloc(sizeof(struct book)))==NULL)                //分配储存空间 
                {        
                        printf("Error!");
                        return NULL;
                }
                p->book_id = book_id;                                        //导入数据 
                strcpy(p->book_name , book_name);
                strcpy(p->keyword1 , keyword1);
                strcpy(p->keyword2 , keyword2);
                strcpy(p->keyword3 , keyword3);
                strcpy(p->keyword4 , keyword4);
                strcpy(p->keyword5 , keyword5);
                strcpy(p->author1 , author1);
                strcpy(p->author2 , author2);
                strcpy(p->author3 , author3);
                strcpy(p->publisher , publisher);
                strcpy(p->publish_time , publish_time);
                p->next = NULL;        //顺序建立链表 
                if(head == NULL)
            head = p;
            else
            tail->next = p;
            tail = p;
        }                        //链表头地址是head,最后的next是NULL
        fclose(f);
        return head;        //返回头指针 
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-25 20:32:19 | 显示全部楼层
笔者奇怪的是while循环应该是都有出口,但是为什么第二种没有输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-25 20:58:40 | 显示全部楼层
没有输出是什么意思呢,是没有输出链表结点的值吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-25 21:07:53 | 显示全部楼层
chxchxkkk 发表于 2020-5-25 20:58
没有输出是什么意思呢,是没有输出链表结点的值吗?

就是我那里文件数据导入到链表里,第一种的printf能打印出排序后的数据,第二种全黑的,啥都没有,没有输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-25 21:46:05 | 显示全部楼层
我不会,我是来学习的经验的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-25 22:25:03 | 显示全部楼层
设置断点,单步调试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-28 19:20:23 | 显示全部楼层
拯救一下沉帖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 17:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表