gpt4 book ai didi

c - C 中链表的问题

转载 作者:太空宇宙 更新时间:2023-11-04 01:42:46 27 4
gpt4 key购买 nike

我是 C 的新手,我正在为一个项目处理 XOR 链表。我已经完成了大部分代码,但我似乎无法使列表的删除功能正常工作。它似乎可以删除一些数字,但不能删除您传递给函数的任何数字。任何有 C 经验的人都可以看看并可能指出我哪里出错了吗?我已经为此工作了一段时间,但运气不太好,我已经开始了 3 次以上:(非常感谢任何帮助。谢谢。你可以看到我第一次尝试代码 here 。我只能发布一个链接,因此,如果您希望看到我的第二次尝试,请告诉我,我可以通过电子邮件将其发送给您或其他方式。谢谢您的宝贵时间。

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

struct node {
int data;
unsigned long link;
};
struct node *head, *tail, *currN, *prevN, *nextN, *tmp;

void insert(struct node **headN, struct node **tailN, int n);
void delete(struct node **headN, struct node **tailN, int n);
void list(struct node *head, int i);
void nextNode();
void previNode();

//============================================================

void insert(struct node **headN, struct node **tailN, int numN) {
struct node *newnode = malloc(sizeof(struct node));
newnode->link =(unsigned long)(*headN);
newnode->data = numN;

//if empty list
if (*headN == NULL){
*headN = newnode;
currN = *headN;
(*headN)->link = 0;
} else if ((*headN)->link == (unsigned long)NULL){
if (numN <= (*headN)->data){
newnode->link = (unsigned long) *headN;
(*headN)->link = (unsigned long) newnode;
tail = *headN;
*headN = newnode;
nextN = tail;
prevN = NULL;
} else {
newnode->link = (unsigned long) *headN;
(*headN)->link = (unsigned long) newnode;
tail = newnode;
nextN = NULL;
currN = tail;
prevN = *headN;
}
} else {
currN = *headN;
prevN = NULL;
nextN = (struct node *)(currN->link ^ (unsigned long) prevN);
if (numN > tail->data){
while (currN!=tail){
nextNode();
}
newnode->link = (unsigned long) currN;
currN->link = (unsigned long) newnode ^ (unsigned long) prevN;
tail = newnode;
} else if (numN < head->data){
currN->link = (unsigned long) newnode ^ (unsigned long) nextN;
newnode->link = (unsigned long) currN;
*headN = newnode;
nextN = currN;
currN = *headN;
} else {
while (numN > currN->data){
nextNode();
}
newnode->link = (unsigned long) prevN ^ (unsigned long) currN;
prevN->link ^= (unsigned long) currN ^ (unsigned long) newnode;
currN->link ^= (unsigned long) prevN ^ (unsigned long) newnode;
}
}
}

void delete(struct node **headN, struct node **tailN, int numD){

struct node *prevN = NULL;
struct node *currN = *headN;

while ( currN != NULL )
{
struct node *nextN = (struct node *) (currN->link ^ (unsigned long)prevN);
//if the number is found, then delete it
if (currN->data == numD)
{
if(prevN)
{
prevN->link ^= (unsigned long)currN ^ (unsigned long)nextN;
}
else
*headN = nextN;
if(nextN)
{
nextN->link ^= (unsigned long)currN ^ (unsigned long)prevN;
}
else
*tailN = prevN;
free(currN);
break;
}
prevN = currN;
currN = nextN;
}
}

void list(struct node *head, int i){

if(i == 0){
currN = head;
prevN = NULL;
int count = 1;
nextN = (struct node *) (currN->link ^ (unsigned long) prevN);
printf("Linked List in ascending order\n");
while(currN!=NULL){
if(count <= 10){
printf("%-5d", currN->data);
nextNode();
count++;
}
else{
printf("\n");
count = 1;
}
}
}
printf("\n\n");

if(i == 1){
printf("Linked List in descending order\n");
currN = tail;
int count2 = 1;
prevN = (struct node *) currN->link;
nextN = NULL;
while (currN!=NULL){
if(count2 <= 10){
printf("%-5d", currN->data);
previNode();
count2++;

}else{
printf("\n");
count2 = 1;
}
}
}
printf("\n");
}

void nextNode(){
nextN = (struct node *) (currN->link ^ (unsigned long) prevN);
prevN = currN;
currN = nextN;
}

void previNode(){
prevN = (struct node *) (currN->link ^ (unsigned long) nextN);
nextN = currN;
currN = prevN;
}

int main(){

int i, num;
float seed;
head = NULL; tail = NULL; currN = NULL; prevN = NULL; nextN = NULL;

init_seed(1234567);
set_range(1,9999);
//inserting data into the linked list
for ( i=0; i<100; ++i){
num = rndm();
insert( &head, &tail, num );
}

list((struct node*)head, 0);
//delete((struct node**)head, (struct node**)tail, 45);
//delete((struct node**)head, (struct node**)tail, 4040);
//delete((struct node**)head, (struct node**)tail, 9769);
list((struct node*)head, 1);


return 0;
}

最佳答案

看起来您在互联网上获取了一些代码并尝试使用它。

代码工作得很好,你只是不知道什么是指针。

你在做:

delete((struct node**)head, (struct node**)tail, 45);

下面是变量 headtail 的定义:

struct node {
int data;
unsigned long link;
};
struct node *head, *tail, *currN, *prevN, *nextN, *tmp;

delete() 函数的原型(prototype)是 void delete(struct node **headN, struct node **tailN, int numD);

“哦,编译器正在请求 struct node **,让我们转换它”。它不是这样工作的。

试试这个:

delete(&head, &tail, 45);

关于c - C 中链表的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2444378/

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