-1

ノードをリンクされたリストに降順で挿入するプログラムを書きました.しかし、コードを12,14,13,19,7この順序で数字でテストするときはいつでも.7を入力するときはいつでも、7はすでにリストに含まれています.挿入する前に、このエラーが発生した後、2 を入力して印刷オプションを選択すると、プログラムが無限ループに入りました。間違いが見当たらず、非常に混乱しています。

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

struct node {
   int content;
   struct node* nextLink;
};

typedef struct node NODE;

void print (NODE*);
int insertNode (NODE** head, int x);

int main (void)
{
   int num, choice;
   NODE* head;
   head = NULL;

   do {
      printf("\nPlease press 1 to insert or press 2 to print or press 0 to exit\n");
      scanf("%d", &choice);
      switch (choice) {
         case 0:
            return 0;
            break;

         case 1:
            printf("Enter an integer to insert into the linkedlist:  ");
            printf("\n");
            scanf("%d", &num);
            insertNode(&head, num);
            break;

         case 2:
            print(head);
            break;

         default:
            printf("You entered an invalid number\n");
            return 0;
            break;
      }
   } while (choice == 1 || choice == 2);

   return 0;
}

int insertNode (NODE** head, int i)
{
   NODE* newNode;
   newNode          = (NODE*)malloc(sizeof(NODE));
   newNode->content = i;
   NODE* temporary = *head;
   newNode->nextLink = NULL;

   if ((*head == NULL) || ((*head)->content) < i) {
      *head             = newNode;
      (*head)->nextLink = temporary;
   }
   else {
      do {
         if (((temporary->content) > i) && ((temporary->nextLink->content) < i)) {
            newNode->nextLink   = temporary->nextLink;
            temporary->nextLink = newNode;
            return;
         }
         else if (temporary->content == i) {
            printf("To be inserted value is already in the list\n");
            return;
         }
         temporary = temporary->nextLink;
      } while (temporary->nextLink != NULL);

      if (temporary->content == i) {
         printf("To be inserted value is already in the list\n");
         return;
      }

      temporary->nextLink = newNode;
   }
   return 0;
}

void print (NODE* head)
{
   if (head == NULL) {
      printf("\nLinkedList is empty \n");
   }

   while (head != NULL) {
      printf("%d ", head->content);
      head = head->nextLink;
   }
}
4

3 に答える 3

0

あなたのコードはやりすぎです。別の方法でコーディングしても、特殊なケース (リストの先頭に挿入、末尾に挿入など) はありません。

int insertNode (NODE **head, int val)
{
   NODE *newnode;

   for ( ; *head; head = &(*head)->nextLink) {
        if ( (*head)->content == val) {
            printf("To be inserted value (%d)is already in the list\n", val);
            return 0;
            }
        if ( (*head)->content > val) break;
        }
   newnode = malloc(sizeof *newnode); // Maybe check return here ;-)
   newnode->content = val;
   newnode->nextLink = *head;
   *head = newnode;
   return 1;
}
于 2012-03-24T15:39:12.697 に答える
0

挿入される最初の 2 つの値が降順である場合、コードは機能しません。セグメンテーション違反が発生します。

2 番目の要素の挿入には注意が必要です

したがって、if条件の後

else if (temporary->content > i && temporary->nextLink==NULL)
      (*head)->nextLink = newNode;
于 2012-03-24T14:09:32.390 に答える
0

コンパイルして実行したところ、1 つのことを除いて正常に動作するように見えました。 insertNodeint を返すように定義されていますが、return ステートメントの 3 つは void を返します。コンパイルするために、それらを に変更しましたreturn 0;。そのままコンパイルして実行できた場合は、一貫性のないリターンによってスタックが破壊された可能性があります。

于 2011-03-25T21:23:12.990 に答える