2

これは、リンクされたリスト プログラムのコードです。それほど素晴らしいものではないことはわかっていますが、うまくいきます。ins() 関数を変更して、新しい要素が大きさでリストに挿入されるようにします。つまり、リストの最後のノードには最大の整数が含まれ、最小のノードには最初の整数が含まれます。整数はテキスト ファイルから読み込まれ、main() でわかるように、テキスト ファイル内の INSERT および REMOVE コマンドは、(次の行の次の整数) をリストに挿入するコマンドとして解釈されるか、またはリストから要素を削除します。既存のコードでこれを行うにはどうすればよいですか? ins() 関数を変更しようとしましたが、リストを正しく並べ替えることができませんでした。

#include <stdio.h>
#include <stdlib.h>

struct node {
    int number;
    struct node *next;
};

/* prototypes */

void ins(struct node *llist, int number);
void rem(struct node *llist);
void sho(struct node *llist);

int main(void)
{
    int number;
    char command[6];
    struct node *llist;
    struct node *root;

    llist = (struct node *)malloc(sizeof(struct node));
    llist->number = 0;
    llist->next = NULL;

    root = llist;

    printf("addr: \n\n%p,%p\n\n", &llist, &root);

    FILE *file;
    file = fopen("a3data.txt", "r");

    if (file == NULL)
    {
        printf("\n----------------------------------------\n");
        printf("| Error.  Did not read file.  Exiting. |\n");
        printf("----------------------------------------\n\n");
        exit(1);
    }
    else
    {
        while ((fscanf(file, "%s", command)) != EOF)
        {
            if((strcmp(command, "INSERT"))==0)
                {
                    fscanf(file, "%d", &number);
                    printf("\nINSERT            ", number);
                    ins(llist, number);
                    sho(llist);
                }
            else if((strcmp(command, "REMOVE"))==0)
                {
                    printf("\n         REMOVE   ");                
                    rem(llist);
                    sho(llist);
                }
        }
    }

    printf("\n");
    free(llist);
    return(0);
}

void ins(struct node *llist, int number) 
{
    while(llist->next != NULL)
    {
        llist = llist->next;
    }

    llist->next = (struct node *)malloc(sizeof(struct node));
    llist->next->number = number;
    llist->next->next = NULL;
}

void rem(struct node *llist)
{
    while(llist->next->next != NULL)
    {
        llist = llist->next;
    }

    llist->next = NULL;
}

void sho(struct node *llist)
{
    while(llist->next != NULL)
    {
        printf("%d ", llist->number);
        llist = llist->next;
    }

    printf("%d", llist->number);
}
4

3 に答える 3

0

あなたの場合の変更された機能

void ins(struct node *llist, int number) 
{
  struct node *llist1;
  while(llist->next != NULL)
  {
    if (llist->next->number > number)
       break;
    llist = llist->next;
  }

  llist1 = (struct node *)malloc(sizeof(struct node));
  llist1->number = number;
  llist1->next = llist->next;
  llist->next = llist1;
}
于 2013-07-19T07:12:03.820 に答える
0

関数ではins()、代わりに

while(llist->next != NULL)

使用する

while((llist->next != NULL) && (llist->number < number))

これは、自分自身を挿入しながらソートするのに役立ちます。

関数でもrem()、動的に割り当てたメモリを解放する必要があります。

于 2013-07-19T06:53:53.673 に答える
0

挿入は、要素を末尾に追加するだけです。node(list->number) の現在の値を挿入する数値と比較するコードを作成する必要があります。現在の値が挿入する数値よりも大きい場合は、現在のノードの前に数値を挿入する必要があります。このためには、以前のポインターも保持する必要があります。私が書いたコードは、ロジックを理解するためのものであり、正確性をチェックしていません。

if(llist->number > innumber) {
    node *newNode = (struct node *)malloc(sizeof(struct node);
    newNode->number = innumber; 
    prevPointer->next = newNode;
    newNode->next = llist;
}
于 2013-07-19T06:54:00.623 に答える