好的,所以这里的任务是:实现一个包含25个0到100之间的有序随机整数的列表。
我的方法:在数组中获取25个数字,对数组进行排序并使用数组元素创建列表。
#include <conio.h>
#include <malloc.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
struct Node{
int data;
struct Node *next;
};
int main()
{
struct Node *p=NULL;
struct Node *q=NULL;
int j,i,aux,n,v[25];
for (i=0;i<25;i++)
{
v[i]=rand()%100;
}
for (i=0;i<25;i++)
{
for (j=1;j<25;j++)
{
if (v[i]>v[j])
{
aux=v[i];
v[i]=v[j];
v[j]=v[i];
}
}
}
q=(Node *)malloc(sizeof(struct Node));
q->data=v[0];
q->next=NULL;
for (i=1;i<25;i++)
{
p=(Node *)malloc(sizeof(struct Node));
q->next=p;
p->data=v[i];
p->next=NULL;
q=p;
}
while (p)
{
printf("%d ",p->data);
p=p->next;
}
}
输出:0。
你们能弄明白我做错了吗?
答案 0 :(得分:1)
有很多问题......但是主要问题(导致全部为0)就在这里:
if (v[i]>v[j])
{
aux=v[i];
v[i]=v[j];
v[j]=v[i];
}
您的交换不正确,您将v[i]
的数据存储在aux
中,但您从未将其设置为v[j]
,因此您只需覆盖价值最小的所有内容({ {1}})
你想:
0
另一个主要问题是你没有跟踪列表的“头部”:
v[j] = aux;
您不断为 p=(struct Node *)malloc(sizeof(struct Node));
q->next=p;
p->data=v[i];
p->next=NULL;
q=p;
分配新值,然后使用p
覆盖q
...因此无法找到回来的路。您只能拥有链接列表中的最后一个值
类似的东西:
p
然后:
struct Node* head = NULL;
...
head = q=(Node *)malloc(sizeof(struct Node)); // head points to the first node now
答案 1 :(得分:0)
您不需要设置所有这些数组内容;下面的片段返回具有随机有效载荷的N = cnt节点的链表:
struct Node *getnrandom(unsigned cnt) {
struct Node *p=NULL, **pp;
for (pp=&p; cnt--; pp = &(*pp)->next) {
*pp = malloc (sizeof **pp);
if (!*pp) break;
(*pp)->data = rand();
}
if (*pp) (*pp)->next = NULL;
return p;
}
更新:由于OP似乎需要订购值,他可以执行插入(在正确的位置)到llist(N * N),或者事后排序。 (NlogN)