最近在百度知道上,看到了一个网友问的关于单链表的程序(这里),建立完单链表后打印单链表时总是出现野指针错误,仔细看了下程序,应该是在执行完createLn函数后,la相当于没起作用。 基于此特意研究了一下C语言中的单链表实现,在此做个小结。
结构定义:
typedef struct {
ElementType data;
struct Node *next;
}Node;
typedef Node * Linklist;
在实现上,主要有以下两种情况:
1.使用上面定义的Linklist直接当做参数传递
int main(void){
Linklist ll = (Linklist) malloc(sizeof (Node));
int size = SIZE;
createLinklist(ll, size);
printLinklist(ll);
}
void createLinklist(Linklist ll, int size) {
}
void printLinklist(Linklist ll) {
}
需要注意的是:
a.main函数中ll必须在main函数中使用malloc分配内存,如果在createLinklist中分配内存,那么在调用createLinklist结束的时候,分配的内存将会被释放,在执行printLinklist的时候,就会出现野指针的情况。
b.createLinklist当中引用结构体成员变量的时候应该使用ll->data或者ll->next来引用。
2.使用指向Linklist的指针来作为参数传递
int main(void){
Linklist ll;// = (Linklist) malloc(sizeof (Node));
int size = SIZE;
createLinklist(&ll, size);
printLinklist(ll);//as before
}
void createLinklist(Linklist * ll, int size) {
(*ll) = (Linklist) malloc(sizeof (Node));
}
void printLinklist(Linklist ll) {
}
需要注意的是:
a.当使用指向指针的指针的时候,可以将malloc分配内存的时机放到createLinklist当中去。
b.在createLinklist当中引用结构体成员时应该是(*ll)->data,(*ll)->next而不是ll->data或者ll->next.
C语言中,内存管理以及指针的应用这一块儿,仍然是掌握的不到家,接下来的几天还要继续深入探讨。进一步的总结留待补充。