我已经在下面的链接列表代码中发布了我的第一次尝试。目的是获得一个由10个整数组成的链表,并遍历该列表以使奇数加倍,偶数减半。由于我是链表的新手,因此我目前仅在第一部分中工作:生成列表。
从我看到的例子中,我觉得还不错。它编译正常,但是当我运行它时,出现以下错误消息: “抛出异常:读取访问冲突。B为0xCDCDCDCD。” 这是说“ C = B-> next”的行。
有人知道这意味着什么和/或为什么发生吗? 任何输入将不胜感激:)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
struct node
{
int data;
struct node* next;
};
void freeList(struct node* head);
int main(void)
{
srand(time(NULL));
struct node * A = NULL;
A = malloc(sizeof(struct node));
struct node* B = malloc(sizeof(struct node));
struct node* C = malloc(sizeof(struct node));
struct node* D = malloc(sizeof(struct node));
struct node* E = malloc(sizeof(struct node));
struct node* F = malloc(sizeof(struct node));
struct node* G = malloc(sizeof(struct node));
struct node* H = malloc(sizeof(struct node));
struct node* I = malloc(sizeof(struct node));
struct node* J = malloc(sizeof(struct node));
A->data = (rand() % 10) + 1;
B->data = (rand() % 10) + 1;
C->data = (rand() % 10) + 1;
D->data = (rand() % 10) + 1;
E->data = (rand() % 10) + 1;
F->data = (rand() % 10) + 1;
G->data = (rand() % 10) + 1;
H->data = (rand() % 10) + 1;
I->data = (rand() % 10) + 1;
J->data = (rand() % 10) + 1;
B = A->next;
C = B->next;
D = C->next;
E = D->next;
F = E->next;
G = F->next;
H = G->next;
I = H->next;
J = I->next;
J->next = NULL;
struct node* current = A;
while (current != NULL)
{
printf("%d-->", current->data);
current = current->next;
}
freeList(A);
return 0;
}
void freeList(struct node* A)
{
struct node* temp;
while (A != NULL)
{
temp = A;
A = A->next;
free(temp);
}
}
答案 0 :(得分:4)
这是你的问题
B = A->next;
您从未为A->next
分配任何值,因此该值未初始化。运行时环境在分配时用A
填充了0xCDCDCDCD
所指向的内存,以帮助您发现它尚未初始化。上面的代码行读取A->next
的未初始化值,并将其存储在B
中。这不是有效的指针地址!当您尝试取消引用无效指针C = B->next;
时,下一行代码B
引发异常。
也许您打算写A->next = B;
吗?
答案 1 :(得分:3)
您应该将节点分配给下一个指针,而不是相反。节点就是这样链接的。
A->next = B;
B->next = C;
.
.
.