gpt4 book ai didi

c - c中的链表插入: inserting wrong values

转载 作者:太空狗 更新时间:2023-10-29 15:24:51 26 4
gpt4 key购买 nike

我无法弄清楚我的代码有什么问题,当我运行代码时,我有一些垃圾输出!似乎我正在插入一些奇怪的值。感谢您的帮助:

我的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>

struct node {
int number;
struct node *next;
struct node *prev;
};

struct node *head = NULL;

int number_of_cycles = 0;

int arr[] = {
82, 13, 22, 61, 12, 52, 41, 75, 98, 20, 6, 9, 7, 1, 5, 4, 2, 8, 3
};


/* insert a node directly at the right place in the linked list */
void insert_node(int value);

int main(void) {
struct node *current = NULL;
struct node *next = NULL;

int i = 0;

struct timeval tbegin,tend;
double texec=0.;

// Start timer
gettimeofday(&tbegin,NULL);

/* insert some numbers into the linked list */
for(i = 0; i < 19; i++)
//insert_node(rand());
insert_node(arr[i]);

/* print the list */
printf(" before after\n"), i = 0;
while(head->next != NULL) {
printf("%4d\t%4d\n", arr[i++], head->number);
head = head->next;
}

/* free the list */
for(current = head; current != NULL; current = next)
next = current->next, free(current);
// End timer
gettimeofday(&tend,NULL);

// Compute execution time
texec=((double)(1000*(tend.tv_sec-tbegin.tv_sec)+((tend.tv_usec-tbegin.tv_usec)/1000)))/1000.;

printf("Elapsed time = %f\n", texec);
printf("Number Of Cycles = %d\n", number_of_cycles);

return 0;
}

void insert_node(int value) {
struct node *new_node = NULL;
struct node *cur_node = NULL;
struct node *last_node = NULL;
int found;


new_node = (struct node *)malloc(sizeof(struct node *));
if(new_node == NULL) {
printf("memory problem\n");

}
new_node->number = value;
/* If the first element */
if (head == NULL) {
new_node->next = NULL;
new_node->prev = NULL;
head = new_node;
}

else if (new_node->number < head->number) {
new_node->next = head;
head->prev = new_node;
head = new_node;
new_node->prev = NULL;
}

else {
cur_node = head;
found = 0;
while (( cur_node != NULL ) && ( found == 0 )) {
if( new_node->number < cur_node->number )
{
found = 1;
}
else
{
last_node = cur_node;
cur_node = cur_node->next;
}
number_of_cycles++;
}
if( found == 1 )
{
new_node->prev = cur_node->prev;
new_node->next = cur_node;
cur_node->prev->next = new_node;
cur_node->prev = new_node;
}
else
{
last_node->next = new_node;
new_node->next = NULL;
new_node->prev = last_node;
}
number_of_cycles++;
}

}

这段代码的输出是:

before  after
82 1916799424
13 1916799408
22 1916799392
61 1916799376
12 1916799360
52 1916799344
41 1916799328
75 1916799312
98 1916799296
20 1916799280
6 1916799264
9 1916799248
7 1916799232
1 1916799216
5 1916799200
4 1916799184
2 1916799168
8 1916799152
Elapsed time = 0.000000
Number Of Cycles = 0

最佳答案

你的问题在 insert_node:

new_node = (struct node *)malloc(sizeof(struct node *));

你想要的是:

new_node = (struct node *)malloc(sizeof(struct node));

原因是你想在堆上为结构节点分配足够的空间,而不是结构节点指针。

关于c - c中的链表插入: inserting wrong values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9372403/

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