我的链表有什么问题,为什么它不能在 C 中正确将我的头设置为 NULL?



这是我的程序,我用C写的,我创建了一个结构和一个头,我试图制作一个链表,但我不断获得读取访问违规,似乎我没有正确传递我的头部指针,当它试图添加到我的列表时,它一直有问题。

#define _CRT_SECURE_NO_WARNINGS // Since I want to strictly use ANSI C and not Microsoft C without getting the warning message, I'm adding this line of code before I include header files.
#include <stdio.h>              // "#include" includes the contents of another file, commonly called header file, into the source code file.
#include <string.h>             // This library contains a variety of functions to manipulate strings.
#include <stdlib.h>             // Header file which has the necessary information to include the input/output related functions in our program.
#define MAX 100
typedef struct node {
char model[MAX];
float price;
int miles;
struct node *next;
} *NODEPTR;
NODEPTR getNode();
void freeNode(NODEPTR p);
void printTotalMiles(NODEPTR);
void addLast(NODEPTR *list, char c[], float pri, int num);
int main(void) { //It is the first function of every C program that is responsible for starting the execution and termination of the program. 
int i = 0;
NODEPTR head = NULL;
if (head == NULL) {
printf("NULL");
}
//head = (NODEPTR) malloc(sizeof(struct node));
//head->next = NULL;
//addFront(head, 2600.00, 48000);
//addFront(head, 1400.00, 22000);
//printf("first, %d", head->price);
addLast(head, "64 Impala", 1800.00, 12000);
addLast(head, "56 Ford", 500.00, 23000);
//printTotalMiles(head);
//printArray(p);
return 0; // This statement indicates "main()" is returning the value 0 upon completion.
} //  Curly brace marks the end of the function.
NODEPTR getNode(void) {
NODEPTR p;
p = (NODEPTR)malloc(sizeof(struct node));
if (p == NULL) {
printf("List Overflow.");
}
return (p);
}
void freeNode(NODEPTR p) {
free(p);
}
void addFront(NODEPTR *list, float pri, int num) {
NODEPTR p, q;
p = getNode();
//strcpy(p->model, c);
// memset(p->model, '', sizeof(c))
//printf("%sn", p->model);
p->price = pri;
p->miles = num;
p->next = *list;
*list = p;
q = *list;
printf("hey %.2f heyn", q->price);
}
void printTotalMiles(NODEPTR *list) {
int total = 0;
NODEPTR p;
while (*list) {
p = *list;
printf(" Car: tPrice: %.2ftI drove it: %dn", p->price, p->miles);
total += p->miles;
list = p->next;
}
printf("The Total Miles: %d", total);
}
void addLast(NODEPTR *list, char c[], float pri, int num) {
NODEPTR p, q;
p = getNode();
memset(p->model, '', sizeof(c));
strcpy(p->model, c);
p->price = pri;
p->miles = num;
p->next = NULL;
if (*list == NULL) {
*list = p;
} else {
q = *list;
while (q->next) {
q = q->next;
}
q->next = p;
}
}
//void printArray(struct node cars[]) { //function definition
//    break;
//}

我怎样才能得到它,这样我才能正确地将节点添加到这个列表中?

我只是想让它添加节点的列表与字符,float和int。我试着搞乱指针,我试着先设置头和设置头- null旁边,但似乎没有任何工作。每次尝试处理null时都会出现错误。

void addLast(NODEPTR* list, char c[], float pri, int num);

addLast想要一个指向指针的指针(读它是一个好主意来定义指针吗?),但是你在这里传递一个指针:

addLast(head, "64 Impala", 1800.00, 12000);
addLast(head, "56 Ford", 500.00, 23000);

切换到

addLast(&head, "64 Impala", 1800.00, 12000);
addLast(&head, "56 Ford", 500.00, 23000);

:

void addLast(NODEPTR* list, char c[], float pri, int num) {
NODEPTR p, q;
p = getNode();
memset(p->model, '', sizeof(c));
strcpy(p->model, c);

sizeof(c)是指针的大小(读什么是C中的"数组衰减"?)。

使用成员的大小,在本例中是MAX:

memset(p->model, '', MAX);

或者更好:删除整行,如果在下一行调用strcpy就不需要了。

一个:

void printTotalMiles(NODEPTR* list) {

与原型不同:

void printTotalMiles(NODEPTR);

使用警告编译。

最新更新