在C中创建已排序的链接列表

时间:2015-04-14 22:56:15

标签: c list hyperlink sorted

我正在寻找创建一种方法来按PID的升序插入结构。

我一直在检查其他线程,并且我已经像其他人提到的那样写了一些东西,但是在编译Next_PCB并输入冲突时我遇到了错误。

struct PCB
{
    struct PCB *Next_PCB;
    int PID;
};

struct PCB *ptr, *tmp;

void insert_ordered (struct PCB *, struct PCB *);
void print_list(struct PCB *);

main()
{
    int num_structs, i;
    ptr = (struct PCB *) malloc (sizeof (struct PCB));
    num_structs = 10 + (rand() % 10);
    for ( i = 0; i < num_structs; i++)
    {
        tmp = (struct PCB *) malloc (sizeof(struct PCB));
        tmp->PID = rand() % 20;
        tmp->Next_PCB = NULL;
        insert_ordered(ptr, tmp);
    }
    print_list(ptr);
}

void insert_ordered (struct PCB *Head, struct PCB *Add)
{
    struct PCB* new;
    if(*Head == NULL || *Head->PID >= Add->PID)
    {
        Add->Next_PCB = *Head;
        *Head = Add;
    }
    else
    {
        new = *Head;
        while (new ->Next_PCB!=NULL && new->Next_PCB->PID < Add -> PID)
        {
            new = new->Next_PCB;
        }
        Add->Next_PCB = new->Next_PCB;
        new->Next_PCB = Add;
    }
}

函数insert_ordered是问题发生的地方,我处理结构的方式是导致问题的原因所以我很好奇我对方法本身的错误以及结构。

2 个答案:

答案 0 :(得分:0)

您在问为什么编译器不喜欢insert_ordered()中的代码。

当我将代码提交给GCC时,它有5个函数问题,所有这些都是因为当*Head是[{1}}的实例时,你将struct PCB视为指针。

*Head不是指针,使其成为函数原型应具有struct PCB **Head的指针。然后Head是指向指针的指针:它指向调用者拥有的变量,而该调用者又是指向列表头部的指针。

所以,代码是:

void insert_ordered (struct PCB **Head, struct PCB *Add)
{
  struct PCB* new;
  if ((*Head == NULL) || ((*Head)->PID >= Add->PID))
  {
    Add->Next_PCB = *Head;
    *Head = Add;
  }
  else
  {
    new = *Head;
    while ((new->Next_PCB != NULL) && (new->Next_PCB->PID < Add->PID))
    {
      new = new->Next_PCB;
    }
    Add->Next_PCB = new->Next_PCB;
    new->Next_PCB = Add;
  }
}

当然,insert_ordered()的调用必须更改为insert_ordered(&ptr, tmp) ;

这是有效的,但正如Benjy所说,这不是一个很好的算法。我认为这是一个学习练习,在下一课中你将看到一个二叉树。

顺便说一句,在if ((*Head == NULL) || ((*Head)->PID >= Add->PID))中我添加了一些不必要的括号。这是因为,尽管没有括号的代码对编译器来说是明确的,但它让我的一些同事感到困惑。额外的括号使它更具可读性......除非你得到太多。但需要(*Head)->PID中的括号。

答案 1 :(得分:0)

至少有一些我可能没有找到的问题,但这就是我所看到的:

  • 您需要能够在插入例程中更改头指针的值。您的插入例程似乎是为了执行此操作而写的,因为您已经在执行类似&#34; * Head == NULL&#34;的操作。您需要知道的是正确地声明它&#34; struct PCB ** Head&#34;并正确传递&#34; insert_ordered(&amp; ptr,tmp)&#34;。
  • 您需要正确处理初始ptr值。你正在为它提供空间,但不要在其中加入任何东西。相反,您应该将该malloc替换为NULL赋值:&#34; ptr = NULL&#34;。