0

このプログラムでは、ユーザーがいくつかの名前を入力し (ユーザーが続行するまで)、それらの名前を昇順で表示できるようにする必要があります。char 配列の比較に strncmp 関数を使用しました。しかし、これが実行されると、ソートされた名前リストの最初と最後の名前だけが出力として与えられます (つまり、リストはソートされました)。しかし、それらの間の名前が表示されない理由がわかりません。私を助けてください!ありがとうございました。

#include <stdio.h>
#include <malloc.h>
#include <string.h>

char name[10];
int place;

struct node
{
  char nm[10];
  struct node *next;
}*newnode, *prev, *temp, *display, *current, *list;

void createlist()
{
  list = NULL;
}
;

void insert()
{
  newnode = (struct node*) malloc(sizeof(struct node));

  printf("Enter the Name: ");
  scanf("%s", &name);
  strncpy(newnode->nm, name, 10);
  newnode->next = NULL;

  if (list == NULL )
  {
    list = newnode;
  }
  else if (strncmp(name, list->nm, 10) < 0)
  {
    newnode->next = list;
    list = newnode;
  }
  else
  {
    temp = list;

    place = 0;

    while (temp != NULL && place == 0)
    {
      if (strncmp(name, temp->nm, 10) >= 0)
      {
        prev = temp;
        temp = temp->next;
      }
      else
      {
        place = 1;
      }
      newnode->next = prev->next;
      prev->next = newnode;
    }
  }
}

void displayname()
{
  if (list == NULL )
    printf("\n\nList is empty");
  else
  {
    display = list;
    while (display != NULL )
    {
      printf("%s\n", display->nm);
      display = display->next;
    }
  }
}

int main()
{

  char choice;
  choice == 'y';

  createlist();
  do
  {
    insert();
    printf("Do you want to continue? ");
    scanf("%s", &choice);
  } while (choice = 'y' && choice != 'n');

  displayname();
}
4

2 に答える 2

0

挿入機能では、使用しています

newnode->next = prev->next;
prev->next = newnode;

のように使う

newnode->next = temp;
prev->next = newnode;

[編集]

このように挿入機能を使用します。

void insert()
{
    newnode = (struct node*) malloc(sizeof(struct node));

    printf("Enter the Name: ");
    scanf("%s", &name);
    strncpy(newnode->nm, name, 10);
    newnode->next = NULL;

    if (list == NULL )
    {
        list = newnode;
    }
    else if (strncmp(name, list->nm, 10) < 0)
    {
        newnode->next = list;
        list = newnode;
    }
    else
    {
        temp = list;

        prev = NULL;
        // prev is a global variable, So assign it to NULL each time, Otherwise it will keep old value.
        while (temp != NULL)
        {
            if (strcmp(name, temp->nm) >= 0)
            {
                prev = temp;
                temp = temp->next;
            }
            else
            {
              break;

            }
        }
        newnode->next = temp;
        prev->next = newnode;
    }
}

ここで、コードで 1 つのことを覚えておいてください。

  1. main() であなたがやっている

    選択 == 'y'; それは割り当てではありません。使用する必要があります

    選択 = 'y';

  2. main() で、do{}while() で使用している

    while (選択 = 'y' && 選択 != 'n'); choice ='y' は代入であり、比較ではありません。このように使う

    while (選択 == 'y' && 選択 != 'n');

  3. main() で、使用している

    scanf("%s", &choice); // 選択は char です。ここに文字列 (%s) を入れようとしています。それはメモリの破損になりますので、このように使用してください、

    選択 = getche();

于 2013-09-08T09:46:11.007 に答える