在C中将通用代码调整为不同大小的链表

时间:2014-08-30 01:17:23

标签: c linked-list

对于编程分配,我们被要求从文本文件中读取一些数据并用数据填充链接列表。以下是我们给出的示例代码:

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

#define MAX_INPUT 20
#define EXTRA_CHARS 2

typedef struct listNode
{
   int data;
   struct listNode * next;
} ListNode;

typedef ListNode * ListNodePtr;

int main()
{
   ListNodePtr head, new, current, previous, next;
   unsigned listSize;

   int i, anInt;
   char str[MAX_INPUT];

   listSize = 0;
   head = NULL;

   while (fgets(str, MAX_INPUT+EXTRA_CHARS, stdin) != NULL)
   {
      /* Parsing the string to int */
      if(sscanf(str,"%d",&anInt) != 1)
      {
         sprintf(str, "Invalid input entered \n");
         exit(EXIT_FAILURE);
      }

      /* Creating the node using malloc(...) */

      if ( (new=malloc(sizeof(ListNode))) == NULL)
      {  
         fprintf(stderr,"\nMemory Allocation for ListInsert failed!\n");
         fprintf(stderr,"Aborting data entry!\n");
         break;
      }

      current = head;
      previous = NULL;
      /* Search to find where in insert new list node */
      while (current != NULL && current->data < anInt)
      {
         previous = current;
         current = current->next;
      }

      new->data = anInt;
      new->next = current;
      listSize++;

      if (previous == NULL)
      {
         head = new;
      }
      else
      {
         previous->next = new;
      }
   }/*End of input loop */

   /* Display integers in linked list */
   current = head;
   while (current != NULL)
   {
      printf("%d\n", current->data);
      current = current->next;
   }

   /* Deallocate memory used by list nodes */
   current = head;
   while (current != NULL)
   {
      next = current->next;
      free(current);
      current = next;
   }

   return EXIT_SUCCESS;
}

这是我遇到的问题。在我到目前为止在网上或书中看到的链接列表的每个示例中,链表的定义是作为结构给出的,该结构仅包含一个数据项和指向列表中下一个节点的指针。问题是我们已经给出了以下结构定义来填充数据:

typedef struct price
{
   unsigned dollars;
   unsigned cents;
} PriceType;

typedef struct item
{
   char itemID[ID_LEN + 1];
   char itemName[MAX_NAME_LEN + 1];
   PriceType prices[NUM_PRICES];
   char itemDescription[MAX_DESC_LEN + 1];
   ItemTypePtr nextItem;
} ItemType;

typedef struct category
{
   char categoryID[ID_LEN + 1];
   char categoryName[MAX_NAME_LEN + 1];
   char drinkType;      /* (H)ot or (C)old. */
   char categoryDescription[MAX_DESC_LEN + 1];
   CategoryTypePtr nextCategory;
   ItemTypePtr headItem;
   unsigned numItems;
} CategoryType;

typedef struct bcs
{
   CategoryTypePtr headCategory; /* Pointer to the next node */
   unsigned numCategories;
} BCSType;

这与我见过的所有例子不符。因此,在上面的“通用”代码中,我是否必须执行上述所有操作,但将“new-&gt; data”部分替换为“category-&gt; categoryID”和“category-&gt; categoryName”等对于结构的所有成员,以便用数据填充整个链表?

1 个答案:

答案 0 :(得分:0)

您提供了数据结构所需的一切。有一个顶级项目BCSType,导致其他所有内容。它有一个链接的类别列表,其中包含headCategory中的头部链接。并且每个CategoryType都有一个下一个指针(nextCategory)和一个头链接(headItem)到ItemTypes的链接列表,每个链接列表都有一个下一个指针{{ 1}}。你不需要为这些结构添加任何东西而不应该(如果你这样做,你将被降级)。现在,您需要编写从文件中读取数据的代码并创建这些数据结构的实例,使用示例代码作为处理链接列表的指南......但您必须思考并具有创造性,才能应用它你得到的三级结构。

这里至关重要的是通过实践来学习。尝试编写这样的代码并且不要放弃,但如果你真的遇到困难,你可以作为最后的手段在这里提出另一个问题......但是当你这样做时要非常具体,并包括你的代码和错误消息以及关于您预期会发生什么以及实际发生了什么的所有其他相关信息。在发布此类问题之前,请务必学习如何使用调试器并使用它。