首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C在LinkedList中插入结构

C在LinkedList中插入结构
EN

Stack Overflow用户
提问于 2015-04-20 18:30:01
回答 1查看 2.3K关注 0票数 2

嗨,我正在尝试插入一个结构,我已经创建了一个列表,按PID数字的升序排列。这是我的代码:

代码语言:javascript
运行
复制
#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中?我目前有:

代码语言:javascript
运行
复制
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。

EN

回答 1

Stack Overflow用户

发布于 2015-04-20 18:57:02

这应该可以做到:

代码语言:javascript
运行
复制
#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;
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29755648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档