Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中使泛型代码适应不同大小的链表_C_Linked List - Fatal编程技术网

在C语言中使泛型代码适应不同大小的链表

在C语言中使泛型代码适应不同大小的链表,c,linked-list,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

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

#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;
}

这与我见过的所有例子都不相符。因此,在上面的“通用”代码中,我是否必须执行上面的所有操作,但将结构的所有成员的“新建->数据”部分替换为“类别->categoryID”和“类别->categoryName”等,以便用数据填充整个链表?

以数据结构的方式提供给您所需的一切。有一个顶级项目,
BCSType
,它会导致其他一切。它有一个类别的链接列表,标题链接位于
headCategory
。每个
CategoryType
都有一个下一个指针(
nextCategory
),以及指向
ItemTypes
链接列表的头链接(
headItem
),其中每个都有一个下一个指针,
nextItem
。您不需要向这些结构添加任何内容,也不应该这样做(如果这样做,您将得到降级)。现在,您需要编写从文件读取数据并创建这些数据结构实例的代码,使用示例代码作为处理链表的指南。。。但是你必须思考,并且要有创造力,才能将它应用到你所得到的三层结构中


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

“在我在网上或书中看到的每个链表示例中”——但这些都是简化的示例。你需要学会抽象地思考。。。显然,原则上没有理由认为节点中的数据项不能多于(或少于)一个。如果你从未见过这样的东西,你就没有读过很多书。。。示例一直都在这里发布。请仔细查看。您可以将它们全部打包在一起,从而允许使用单个节点链接。但是将“新建->数据”部分替换为,例如,“类别->类别ID”和“类别->类别名称”--不,您不必替换任何内容。。。您得到的结构在CategoryTypePtr和ItemTypePtr成员中已经有了所需的所有“下一个”指针。@Jim Balter但当我尝试使用代码时,编译器告诉我结构中没有成员“数据”,等等,所以我必须使用单个结构的成员名称,而不是泛型变量。正如我所说,结构包含您需要的所有内容。。。这不包括
数据
成员。。。同样,这只是一个简化的例子。“所以我必须使用单个结构的成员的名称,而不是泛型变量”——您必须使用结构的名称及其提供给您的成员的名称。我不知道你说的“通用变量”是什么意思。。。“数据”只是一个例子。专业程序员很少使用像这样没有意义的名字,他们使用有意义的名字,就像给你的结构定义一样。好的,谢谢。实际上,我已经做了几天了,我已经编写了几个函数来完成所有这些工作,但都没有用。我发布这个问题是因为我认为链表中有一些基本的东西我遗漏了,这让我大吃一惊。我会回到绘图板上,也许会重新开始。我的代码变得太大、太乱了。@LeeCarbusier我建议开始时自上而下地编写代码——用指明函数需要执行的操作的名称编写函数调用,然后编写一个尚未编写的函数,然后重复。如果在编写函数时,您发现您对如何分割函数做了一个错误的假设,那么返回并修改调用方——这是自下而上的。但主要是自上而下的。@LeeCarbusier请查看我在您的问题下的最新评论。。。我误解了你,所以我们的交流走错了方向。。。那完全是我的错,因为你是对的。如果我误导了你,我很抱歉。@LeeCarbusier“没有用”——正如我在回答中所说的,你应该对这些事情非常具体。你的代码没有编译吗?它是编译但崩溃,还是无限循环,还是产生错误的结果?你可以在这个问题上附加你的代码和你遇到的错误,你可能会得到帮助。。。所以鼓励发布实际代码。@LeeCarbusier正如Jim所建议的那样,通过一个简单的列表从上到下写一个好的列表将提高您的列表信心。列表没有魔力,它们是工具箱中最灵活的数据结构之一。从简单的一个数据项/下一个结构开始。您会发现在列表创建(1)
create node
中有两个基本函数,您可以在其中为需要分配的任何成员分配节点(struct)和存储;然后(2)在检查列表是否存在的位置插入节点(如果不存在,则节点是第一个节点),如果存在,则根据需要设置
->next
指针。卡住时回贴。
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;