首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C在链表开头插入元素

C在链表开头插入元素
EN

Stack Overflow用户
提问于 2015-04-20 21:01:42
回答 1查看 807关注 0票数 1

我用C语言编写了一个程序,用于将结构按升序插入到链接列表中。

问题是没有插入我的两个最低值(1和2)。这是因为我目前没有一个工作处理程序来检查链接列表的第一个值是否已经大于给定的值。

这是我的功能:

代码语言:javascript
复制
struct PCB
{
    struct PCB *Next_PCB ;
    int PID ;
};

void insert_ordered (struct PCB *Head, struct PCB *Add)
{
    tmp = Head;
    if (Head->PID == 0) {
        Head->PID = Add->PID;
    } else {
        if (Head->Next_PCB == NULL) {
            Head->Next_PCB = Add;
        } else {
            int count = 0;
            while (Head != NULL) {
                if (Add->PID > Head->PID) {
                    if (Head->Next_PCB != NULL) {
                        Head = Head->Next_PCB;
                        count++;
                    } else {
                        Head->Next_PCB = Add;
                        break;
                    }
                } else if (Add->PID == Head->PID) {
                    Add->Next_PCB = Head->Next_PCB;
                    Head->Next_PCB = Add;
                    break;
                } else if (Add->PID < Head->PID) {
                    if (Add->PID == 1 || Add->PID == 2) {
                        printf("found 1 or 2");
                        printf("count: %d", count);
                    }
                    int ct = 0;
                    while (tmp != NULL) {
                        if (count == 0) {
                            printf("made it, %d", ct);
                            Add->Next_PCB = tmp;
                            break;
                        } else if (ct == (count - 1)) {
                            Add->Next_PCB = Head;
                            tmp->Next_PCB = Add;
                            break;
                        }
                        tmp = tmp->Next_PCB;
                        ct++;
                    }
                    break;
                }
            }
        }
    }
    printf("pid : %d\n", Add->PID);
}

这是打印出列表后的输出:

代码语言:javascript
复制
pid : 6
pid : 17
pid : 15
pid : 13
pid : 15
pid : 6
pid : 12
pid : 9
found 1 or 2count: 0made it, 0pid : 1
found 1 or 2count: 0made it, 0pid : 2
pid : 7
pid : 10
pid : 19

-------------------
PID: 6
PID: 6
PID: 7
PID: 9
PID: 10
PID: 12
PID: 13
PID: 15
PID: 15
PID: 17
PID: 19

输出应该在两个6之前有一个1和一个2。有人能帮我吗?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-20 23:43:43

void insert_ordered (struct PCB *Head, struct PCB *Add):不可能替换这个接口中元素的头。因此,您需要对虚拟元素中的第一个元素(非持久化内容的Anchor节点)。

以下是一个具体的例子:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

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

struct PCB *new_PCB(int PID){
    struct PCB *pcb = malloc(sizeof(*pcb));
    if(pcb != NULL){
        pcb->Next_PCB = NULL;
        pcb->PID = PID;
    }
    return pcb;
}

void insert_ordered (struct PCB *Head, struct PCB *Add){
    if(Head == NULL)
        return ;//can't

    struct PCB *prev = Head, *curr = Head->Next_PCB;
/*  this is reduced to following while-loop
    if(Head->Next_PCB == NULL){//empty list
        Head->Next_PCB = Add;
        return ;
    }
    if(Add->PID <= curr-> PID){//Add node <= Top node
        prev->Next_PCB = Add;
        Add->Next_PCB = curr;
        return ;
    }
*/
    while(curr != NULL && curr->PID < Add->PID){
        prev = curr;
        curr = curr->Next_PCB;
    }
    prev->Next_PCB = Add;
    Add->Next_PCB = curr;
}

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

//alias
#define Make_list() new_PCB(-1)

int main(void){
    struct PCB *head = Make_list();
    //struct PCB *head = new_PCB(-1);//dummy node, This is intended to holds a list.
    insert_ordered (head, new_PCB( 6));
    insert_ordered (head, new_PCB(17));
    insert_ordered (head, new_PCB(15));
    insert_ordered (head, new_PCB(13));
    insert_ordered (head, new_PCB(15));
    insert_ordered (head, new_PCB( 6));
    insert_ordered (head, new_PCB(12));
    insert_ordered (head, new_PCB( 9));
    insert_ordered (head, new_PCB( 1));
    insert_ordered (head, new_PCB( 2));
    insert_ordered (head, new_PCB( 7));
    insert_ordered (head, new_PCB(10));
    insert_ordered (head, new_PCB(19));

    print(head);
    //release list
    return 0;
}

或者你需要像交换内容一样交换内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29758332

复制
相关文章

相似问题

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