【问题标题】:C Insert Struct Into LinkedListC将结构插入LinkedList
【发布时间】:2015-04-20 18:30:01
【问题描述】:

您好,我正在尝试将我创建的结构按 PID 编号按升序插入到列表中。这是我的代码:

#include <stdlib.h> //for malloc and rand
#include <stdio.h>

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

struct PCB *ptr, *tmp, *tmp1;
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)
{
    if (Head->Next_PCB == Head) {
        Head = Add;
    }
}

void print_list(struct PCB *Head)
{
    while (Head != NULL) {
        if (Head->Next_PCB != NULL) {
            printf("PID: %d\n", Head->PID);
            Head = Head->Next_PCB;
        } else {
            printf("PID: %d\n", Head->PID);
            break;
        }
    }
}

尽管insert_ordered() 似乎应该在添加元素之前打印一次,但它不会显示输出:

PID:0

另外,我将如何正确地将元素插入到 LinkedList 中?我目前有:

while (Head != NULL) {
        if (Head->Next_PCB != NULL) {
            if (Add->PID > Head->PID) {
                Head = Head->Next_PCB;
                printf("pid bigger: %d than current pid: %d\n", Add->PID, Head->PID);
            } else if (Add->PID == Head->PID) {
                //Head->Next_PCB = Add;
                printf("adding pid equal: %d to current pid: %d\n", Add->PID, Head->PID);
            } else if (Add->PID < Head->PID) {
                //Head->Next_PCB = Add;
                printf("adding pid smaller: %d than current pid: %d\n", Add->PID, Head->PID);
            }
        } else {
            Head->Next_PCB = Add;
        }
    }

这不能正常工作。这可能是我最初的 if 语句没有正确捕获的结果,但无论哪种方式我都很难过。

提前致谢,SOF。

【问题讨论】:

  • Head = Add in insert_ordered 并不像你认为的那样。它将Add 中保存的地址分配给Head 指针。为Headptrmain())传递的调用者的指针是按值传递的,因此是不变的。此外,ptr 引用的已分配节点的 Next_PCB 成员从未初始化,并调用 未定义行为 进行评估。
  • 还是想不通:/

标签: c list struct insert


【解决方案1】:

应该这样做:

#include <stdlib.h> /* malloc, rand */
#include <stdio.h>  /* printf */
#include <assert.h> /* assert */

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

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

main()
{
    int num_structs, i;

    num_structs = 10 + (rand() % 10) ;
    for ( i = 0 ; i < num_structs ; i++)
    {
        tmp = (struct PCB *) malloc (sizeof(struct PCB)) ;
        tmp->PID = rand() % 20 ;
        printf("%d ", tmp->PID);
        tmp->Next_PCB = NULL ;
        insert_ordered(tmp) ;
        printf("\n");
        print_list(List);

        printf("\n");
    }
    print_list(List);
}

void insert_ordered (struct PCB *Add)
{
    struct PCB *Runner = List;
   if (List == NULL || Add->PID < List->PID) {
          Add->Next_PCB = List;
        List = Add;
        return;
    }

    while (Runner->Next_PCB && Add->PID > Runner->Next_PCB->PID){
        Runner = Runner->Next_PCB;
    } 

    if (Runner->Next_PCB && Add->PID <= Runner->PID)
    {
        Add->Next_PCB = Runner->Next_PCB;
        Runner->Next_PCB = Add;
    }
    else
    {
        Add->Next_PCB = Runner->Next_PCB;
        Runner->Next_PCB = Add;
    }
}

void print_list(struct PCB *Head)
{
    while (Head != NULL) {
        if (Head->Next_PCB != NULL) {
            printf("PID: %d\n", Head->PID);
            Head = Head->Next_PCB;
        } else {
            printf("PID: %d\n", Head->PID);
            break;
        }
    }
}

【讨论】:

  • 我似乎不断收到Segmentation fault (core dumped) 错误。我尝试了很多方法,包括你的方法,但我遇到了这个错误。我使用的代码在这里; pastebin.com/vM12B55a
猜你喜欢
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多