对C中不同大小链表的通用代码进行了调整



对于编程任务,我们被要求从文本文件中读取一些数据,并用这些数据填充链表。下面是我们得到的示例代码:

#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("%dn", 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->data"部分替换为"category->categoryID"one_answers"category->categoryName"等,以便用数据填充整个链表?

数据结构方面所需的一切都已提供给您。有一个顶级项目BCSType,它可以引出其他一切。它有一个类别的链接列表,标题链接在headCategory中。并且每个CategoryType具有下一个指针(nextCategory)和指向ItemTypes的链表的头链接(headItem),其中每个都具有下一指针nextItem。你不需要在这些结构中添加任何内容,也不应该添加(如果添加,你会被降级)。现在,您需要编写从文件中读取数据并创建这些数据结构实例的代码,使用示例代码作为处理链表的准则。。。但你必须思考,并且要有创造性,把它应用到你所得到的三级结构中。

这里最重要的是在实践中学习。试着写这样的代码,不要放弃,但如果你真的陷入困境,作为最后的手段,你可以在这里问另一个问题。。。但是当你这样做的时候要非常具体,包括你的代码和错误消息,以及关于你期望发生的事情和实际发生的事情的所有其他相关信息。在发布这样的问题之前,一定要学会如何使用调试器。

相关内容

  • 没有找到相关文章

最新更新