gpt4 book ai didi

c - 如何删除 C 中双向链表中的备用节点?

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

我编写了以下代码,但在执行 create() 函数后它停止工作。我想删除从头节点开始的备用元素。我的 delete_Alt() 函数是否正确?请告诉我哪里错了。

#include <stdio.h>
#include <stdlib.h>

// using a structure
typedef struct mynode {
int data;
struct mynode *prev; // to point to previous node
struct mynode *link; // to point to next node
} node;
node *head = NULL;

// creating the list
void create() {
node *p, *q;
int ch;
do {
p = (node *)malloc(sizeof(node));
printf("enter data\n");
scanf("%d", &p->data);
if (head == NULL)
{
p->prev = head;
q = p;
}
else
{
p->prev = q;
p->link = NULL;
q->link = p;
q = p;
}
printf("create another node?, press 1 ");
scanf ("%d",&ch);
} while(ch==1);
}

//to delete alternate elements
void delete_Alt() {
if (head == NULL)
printf("Empty list...ERROR");

node *previous, *current, *next;
previous = head;
current = head->link;
while (previous !=NULL && current != NULL) {
previous->prev = current->prev;
previous->link = current->link;

next = current->link;
previous->link = next;
next->prev = previous;

free(current);
}
}

// print the list
void display() {
node *temp;
temp = head;
while (temp != NULL) {
printf("%d ",temp->data);
temp = temp->link;
}
printf("\n");
}

int main() {
node *head = NULL;
create();
printf("List before deleting is: ");
display();
delete_Alt();
printf("List after deleting is: ");
display();
return 0;
}

最佳答案

你在创建和删除函数中犯了一些小错误......

这是更新后的代码试试看...

#include <stdio.h>
#include <stdlib.h>

// using a structure
typedef struct mynode {
int data;
struct mynode *prev; // to point to previous node
struct mynode *link; // to point to next node
} node;
node *head = NULL;

// creating the list
void create() {
node *p, *q;
int ch;
do {
p = (node *)malloc(sizeof(node));
printf("enter data\n");
scanf("%d", &p->data);
p->link = NULL;
if (head == NULL)
{
p->prev = NULL;
head = p;
}
else
{
q = head;
while (q->link != NULL)
q = q->link;
p->prev = q;
q->link = p;
}
printf("create another node?, press 1 ");
scanf ("%d",&ch);
} while(ch==1);
}

//to delete alternate elements
void delete_Alt() {
if (head == NULL)
printf("Empty list...ERROR");

node *previous, *current, *next;
previous = head;
current = head->link;
while (previous !=NULL && current != NULL)
{
previous->link = current->link;
next = current->link;
free(current);
if(next)
{
next->prev = previous;
current = next->link;
}
else
current = NULL;
previous = next;
}
}

// print the list
void display() {
node *temp;
temp = head;
while (temp != NULL) {
printf("%d ",temp->data);
temp = temp->link;
}
printf("\n");
}

int main() {
node *head = NULL;
create();
printf("List before deleting is: ");
display();
delete_Alt();
printf("List after deleting is: ");
display();
return 0;
}

关于c - 如何删除 C 中双向链表中的备用节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43425462/

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