0

さて、これがタスクです:0から100までの25の順序付けられたランダムな整数でリストを実装します。

私のアプローチ:配列内の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。

私が間違ったことを理解できますか?

4

2 に答える 2

1

いくつかの問題があります...しかし、主なもの(すべて0の原因)は次のとおりです。

        if (v[i]>v[j])
        {
            aux=v[i];
            v[i]=v[j];
            v[j]=v[i];
        }

あなたのスワップは正しくありませんv[i]。 のデータを に保存しauxますが、 に設定することはありません。したがって、最小値 ( )v[j]ですべてを上書きしているだけです。0

あなたが欲しかった:

v[j] = aux;

もう 1 つの大きな問題は、リストの「先頭」を追跡していないことです。

    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

じゃあ後で:

p = head; // reset p to the start of the list.
while (p)
{
    ...
于 2012-12-12T19:54:30.733 に答える
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)

于 2012-12-12T20:39:49.610 に答える