gpt4 book ai didi

C编程链表和删除

转载 作者:太空宇宙 更新时间:2023-11-03 23:55:04 24 4
gpt4 key购买 nike

我有一个带有双链表的文件,其中包含一组进程标识符和一些状态信息。

struct pr7_process 
{
pid_t pid; /* process ID, supplied from fork() */
/* if 0, this entry is currently not in use */
int state; /* process state, your own definition */
int exit_status; /* supplied from wait() if process has finished */
struct pr7_process *next; // a pointer to the next process
struct pr7_process *prev;
};

/* the process list */

struct process_list
{
struct pr7_process *head;
struct pr7_process *tail;
};

我有一个方法可以删除列表中的一个元素:

{
struct pr7_process *cur;
for(cur = list->head; cur != NULL; cur = cur->next)
{
if (cur->pid == pid)
{
printf("cur pid: %d\n", cur->pid);
cur->state = STATE_NONE;
if(list->head == list->tail)
{
free(cur);
}
else
{
cur->prev->next = cur->next;
cur->next->prev = cur->prev;
free(cur);
}
break;
}
}
}

我的删除函数有什么问题?当我尝试打印我的列表时,我似乎陷入了无限循环。以前我认为这是我使用 free() 的方式,但显然不是回复:)

谢谢!

最佳答案

添加节点时,将 next 设置为 NULL

然后当你释放所有时,释放直到下一个== NULL。

当您删除一个节点时。更新链接和免费节点。

还有; free on NULL 是一个 noop。

在处理此类事情时,Valgrind 是一个非常宝贵的工具。


相信你必须做更多的检查;即:

struct pr7_process {
int pid;
...
} const new_proc = {
0, 44, 0, NULL, NULL
};

void del(struct process_list *list, int pid)
{
struct pr7_process *cur;

for (cur = list->head; cur != NULL; cur = cur->next) {
if (cur->pid == pid) {

printf("cur pid: %d\n", cur->pid);

if(list->head == list->tail) {
free(cur);
list->head = NULL;
list->tail = NULL;
} else if (cur == list->head) {
list->head = list->head->next;
free(cur);
list->head->prev = NULL;
} else if (cur == list->tail) {
list->tail = cur->prev;
free(cur);
list->tail->next = NULL;
} else {
cur->prev->next = cur->next;
cur->next->prev = cur->prev;
free(cur);
}
break;
}
}
}

鉴于您构建列表某事,例如:

int push(struct process_list *list, int pid, int state)
{
if (list->head == NULL) { /* or move this to where ever you see fit */
if ((list->head = malloc(sizeof(struct pr7_process))) == NULL)
return -1;
list->tail = list->head;
*list->tail = new_proc;
} else {
if ((list->tail->next = malloc(sizeof(struct pr7_process))) == NULL)
return -1;
*list->tail->next = new_proc;
list->tail->next->prev = list->tail;
list->tail = list->tail->next;
}
list->tail->pid = pid;
list->tail->state = state;

return 0;
}

void wipe(struct process_list *list)
{
struct pr7_process *node = list->tail;

while (node != list->head) {
node = list->tail->prev;
free(list->tail);
list->tail = node;
}
free(list->head);
list->head = NULL;
list->tail = NULL;
}

void prnt(struct process_list list, int dir)
{
if (dir == 1) {
while (list.head != NULL) {
printf("%4d: %d\n", list.head->pid, list.head->state);
list.head = list.head->next;
}
} else {
while (list.tail != NULL) {
printf("%4d: %d\n", list.tail->pid, list.tail->state);
list.tail = list.tail->prev;
}
}
}

int main(void)
{
struct process_list list = {NULL, NULL};

push(&list, 331, 2); /* if(push() != -1) ... */
push(&list, 332, 66);
push(&list, 333, 47);

prnt(list, 1);

del(&list, 332);
prnt(list, 1);

wipe(&list);
prnt(list, 1);

return 0;
}

关于C编程链表和删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10060143/

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