題目在注釋里,這題可能有點復雜,有勞各位費心、費眼、費腦了

我目前卡在(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);//列印新的鏈表
}
令人無語的結果:
uj5u.com熱心網友回復:
第二大段注釋那里“不能用鏈表排序”打錯了,應該是“不能用陣列輔助排序”
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/282192.html
標籤:C語言
上一篇:c語言求助
下一篇:求助!簡單的遞回問題
