您的位置:首页 > 编程语言 > C语言/C++

C语言单链表的若干问题

2014-10-25 23:14 323 查看
最近在百度知道上,看到了一个网友问的关于单链表的程序(这里),建立完单链表后打印单链表时总是出现野指针错误,仔细看了下程序,应该是在执行完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语言中,内存管理以及指针的应用这一块儿,仍然是掌握的不到家,接下来的几天还要继续深入探讨。进一步的总结留待补充。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息