gpt4 book ai didi

C 在链表开头插入元素

转载 作者:太空宇宙 更新时间:2023-11-04 04:37:13 26 4
gpt4 key购买 nike

我用 C 编写了一个程序,旨在将结构按升序插入链表。

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

这是我的功能:

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

这是打印列表后的输出:

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。有人可以帮帮我吗?谢谢。

最佳答案

void insert_ordered (struct PCB *Head, struct PCB *Add):无法替换此界面中元素的头部。所以,你需要在dummy elements中的第一个元素(Anchor node that are not intended contents of holding)。
下面是一个具体的例子:

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

或者您需要像排序一样交换内容。

关于C 在链表开头插入元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29758332/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com