0

入力として数値を要求するプログラムがあります。次に「0」を入力すると、番号/項目が先頭 (リストの一番上) に挿入されます。次に「1」を入力すると、番号/項目が後ろ (リストの一番下) に挿入されます。

私が抱えている問題は、リアコードを機能させることです。これを頭の中で論理的に理解しようとしていますが、正しくないようです。links.h ファイルには Item の定義があります。これには、データと次 (次のオブジェクトへのポインター) が含まれます。

これが私がこれまでに得たコードです。

私は、insertFront() および insertRear() 関数のコーディングを担当しました。フロントはすでに動いています。else ステートメントの後に必要なコードは、おそらく 2 行だけです。

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

int main (void) {
  Item *head, *tail;
  Item *newItem;
  int  data, insert;

  /* Link the empty list */
  head = tail = NULL;

  /* Prompt the user for new data to be inserted into the list */
  while (1) {
    /* Get the data value */
       printf ("Enter the positive integer that you want to insert into list (-1 to end): ");
   fflush(stdout);
  if (scanf ("%d",&data) != 1) {
     /* If it isn't valid input, throw away the rest of the line of input */
     while (getchar() != '\n') { }
     fprintf(stderr, "Invalid data found.  Try again.\n");
     continue;
   }

   /* A negative value terminates the list entry */
   if (data < 0) break;

   printf("Enter a 0 to insert data at the beginning or 1 to insert at the end: ");
   fflush(stdout);
   if (scanf ("%d",&insert) != 1 || insert < 0 || insert > 1) {
     /* If it isn't valid, throw away the rest of the line of input */
     while (getchar() != '\n') { }
     fprintf(stderr, "Must be zero or one!  Try insertion again.\n");
     continue;
   }

   if ((newItem = malloc(sizeof(Item))) == NULL) {
     perror ("Unable to allocate memory for new item");
     return EXIT_FAILURE;
   }
   newItem->next = NULL;
   newItem->data = data;

   if (insert == 0) {
     insertFront (newItem, &head, &tail);
   } else {
     insertRear (newItem, &head, &tail);
   }

   /* Print the list in forward order */
   printf("List in forward order:\n");
   printList (head);
 }
}

/* Insert the item into front of the list */
void insertFront (Item *item, Item **headptr, Item **tailptr) {

    if(*headptr == NULL) {
            *headptr = item; // item is the address
            *tailptr = item;
       } else {

            item->next = *headptr;
            *headptr = item;


       }

  }

   void insertRear (Item *item, Item **headptr, Item **tailptr) {

       if(*tailptr == NULL) {
               *tailptr = item;
               *headptr = item;

       } else {


         item->next = *tailptr;
         *tailptr = item;

          }

     }

  /* Print the list in forward order */
  void printList (Item *head) {
    Item *current = head;
    while (current != NULL) {
      printf ("%d\n", current->data);
      current = current->next;
    }
  }
4

2 に答える 2

1

insertRear() は次のようになります。

void insertRear (Item *item, Item **headptr, Item **tailptr) {
       if(*tailptr == NULL) {
               *tailptr = item;
               *headptr = item;

       } else {

          (*tailptr)->next=item;
         *tailptr = item;

          }

     }

言うまでもなく、item->next は NULL にする必要があります。

于 2013-01-24T03:41:16.400 に答える
1

ヘッド ポインターとテール ポインターが同じように動作しないようにする必要があります。

于 2013-01-24T03:31:19.713 に答える