有关链表的一个问题
可以直接看第44行的位置。不明白为什么第二种就输出不了第一种#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct book //书籍信息的结构
{
int book_id;
char book_name; //一个书的id、一个书名、5个关键字、3个作者、一个发布地、一个发布时间
char keyword1;
char keyword2;
char keyword3;
char keyword4;
char keyword5;
char author1;
char author2;
char author3;
char publisher;
char publish_time;
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;
char keyword1;
char keyword2;
char keyword3;
char keyword4;
char keyword5;
char author1;
char author2;
char author3;
char publisher;
char publish_time;
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; //一个书的id、一个书名、5个关键字、3个作者、一个发布地、一个发布时间
char keyword1;
char keyword2;
char keyword3;
char keyword4;
char keyword5;
char author1;
char author2;
char author3;
char publisher;
char publish_time;
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;
char keyword1;
char keyword2;
char keyword3;
char keyword4;
char keyword5;
char author1;
char author2;
char author3;
char publisher;
char publish_time;
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; //返回头指针
}
笔者奇怪的是while循环应该是都有出口,但是为什么第二种没有输出 没有输出是什么意思呢,是没有输出链表结点的值吗? chxchxkkk 发表于 2020-5-25 20:58
没有输出是什么意思呢,是没有输出链表结点的值吗?
就是我那里文件数据导入到链表里,第一种的printf能打印出排序后的数据,第二种全黑的,啥都没有,没有输出 我不会,我是来学习的经验的{:5_97:} 设置断点,单步调试。 拯救一下沉帖
页:
[1]