【C语言求助】一道有yi点难的链表题
题目在注释里,这题可能有点复杂,有劳各位费心、费眼、费脑了
我目前卡在(b)步,下面就是执行(a)(b)的代码,问题就是 在creat_sort_lianbiao(struct node *head)那里的循环里面会无法执行
令人无语的结果:


我目前卡在(b)步,下面就是执行(a)(b)的代码,问题就是 在creat_sort_lianbiao(struct node *head)那里的循环里面会无法执行
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/*
1.链表与数组综合操作(本题满分100分,每问20分)
a) 生成一个长度100、取值范围在0-300的整数构成的链表,并打印
b) 将其按从小到大的顺序插入到另一个链表,并遍历打印
c) 将这个排好序的链表的结果写入到文件1000_numbers.txt
d) 再从文件读入数据,存储到一个数组,并打印
e) 统计出现频次最多的数字,并打印
*/
struct node
{
int num;
struct node *next;
};
struct node *creat_lianbiao()
{
//生成一个长度100,取值范围在0-300的随机整数构成的链表...Done
//int num;
srand( time(0) );
int i = 0;
struct node *head = NULL, * p = head, *newnode = NULL;
while(1)
{
newnode = (struct node *)malloc(sizeof(struct node));
newnode->num = rand()%301 ;
//printf("%d ",newnode->num);
if(head == NULL)
{
head = newnode;
p = head;
}
else if(head != NULL)
{
p->next = newnode;
p = p->next;
}
i++;
if(i == 100)
{
p->next = NULL;
break;
}
}
//p=head;
return head;
}
//遍历打印链表的函数
void print_lianbiao(struct node *head)
{
struct node *p = head;
int i = 0;
while(p != NULL)
{
i++;
printf("the %dth number: ", i );
printf("%d\n", p->num );
p = p->next;
}
}
/*核心部分:
说明:
1.本题不能在原链表里排序后再插入到另一个链表
2.不能使用链表进行插入
3.我的想法是:循环,找出每次循环的最小值,
把这个最小值所在的结点插入到新建的链表里,同时在原链表里删除该结点
这样在下一次循环的时候就不会找到上次的最小值
4.问题是循环无法执行下去
*/
struct node *creat_sort_lianbiao(struct node *head)
{
struct node *p = head, *head_2 = NULL ,*p_min = head ,*p_2 = head_2;
int min = p_min->num ,i=0;
while(1)//
{
p = head;
min = head->num;
while(1)//每次循环找当前链表里的最小值
{
if(min > p->num)//如果min记录的大于当前值
{
//printf("Done...\n");
min = p->num;
p_min = p;//把当前值的地址给p_min
}
if(p->next == NULL) break; //如果到尾了,break
p = p->next;
}
p = head;
i++;
while(1)//每次循环把原链表的min值所在地址赋给p_2,并将原链表的该结点删除
{
if(p->next == p_min)//循环搜索,如果匹配到p_min
{
p_2->next = (struct node *)malloc(sizeof(struct node)); //开辟节点
p_2->next->next = (struct node *)malloc(sizeof(struct node));//再开辟节点
if(head_2 == NULL)//如果head_2是空链表
{
//printf("Done...\n");
head_2 = p_min;
p->next = p->next->next; //删除原链表中的min值的节点
printf("p_min->num = %d\n",p_min->num);
break;
}
else if(head_2 != NULL)
{
p_2->next = p_min;
p_2 = p_2->next;
p_2->next = NULL;
p->next = p->next->next;
break;
}
}
p = p->next;
}
if(i == 100)//如果执行了100次就结束
{
//printf("Done...\n");
break;
}
}
//printf("Done...\n");
return head_2;
}
void main()
{
printf("第一题:\n");
struct node * head = NULL, * p = head ,* head_2=NULL;
head = creat_lianbiao();//生成一个长度100,取值范围在0-300的随机整数构成的链表...Done
print_lianbiao(head);//打印原链表...Done
putchar('\n');
putchar('\n');
head_2 = creat_sort_lianbiao(head);//生成新的链表
printf("Done...");
print_lianbiao(head_2);//打印新的链表
}令人无语的结果:

...全文
相关推荐
数据结构题集(c语言版)答案
### 数据结构题集(c语言版)答案:深入解析#### 概览《数据结构题集(c语言版)答案》是严蔚敏、吴伟民、米宁三位作者共同编著的一部专为学习数据结构的学生和IT专业人士提供解题思路与实践指导的专业书籍
数据结构(c语言版)习题集 完整答案
### 数据结构(C语言版)习题集完整答案解析#### 一、概述《数据结构(C语言版)习题集》是由清华大学严蔚敏教授编著的一本经典教材,本书全面系统地介绍了数据结构的基本概念、基本原理及常用的数据结构,
严蔚敏数据结构c语言版习题集全答案.doc
"严蔚敏数据结构c语言版习题集全答案.doc"这篇文档是针对严蔚敏编著的《数据结构(C语言版)》一书的习题解答,由kaoyan.com的计算机版版主编写,并有多位网友参与修订和完善。文档中的算法以
数据结构 C语言版(严蔚敏) 习题集 答案
此题旨在展示基本排序算法的实现,同时也是对C语言基本语法的练习。
C 代码 计算 上定义的数据的分段线性插值 常规 2D 网格.rar
在C语言中,实现这个算法通常涉及以下几个关键步骤:1.



