user-0 提问: 新手链表问题：编译通过 运行出错 

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> typedef struct LNODE {     char data;     struct LNODE* next; } LNODE;   void creatlist(); void insert(LNODE* head); void output(LNODE* head);  int main(int argc,char* argv[]) {     LNODE* head=NULL;     head=creatlist();     insert(head);     output(head);     return 0;   } LNODE* creatlist() {       //创建一个只有表头节点的链表     return (LNODE*)malloc(sizeof(LNODE)); } void insert(LNODE* head) {     LNODE* p=NULL;     p=(LNODE*)malloc(sizeof(LNODE));     p->data=getchar();     p->next=NULL;     p->next=head->next;     head->next=p; } void output(LNODE* head) {     LNODE* p=NULL;     p=head->next;     while(p!=NULL) {         putchar(p->data);         p=p->next;     } }

user: user-2
content: //head是传值进去，生成一个临时的指针，分配的内存指针将会赋值给这个临时指针而不会反应到实参中 void creatlist(LNODE* head);  改为 void creatlist(LNODE *&head); //修改head为指针的引用

user: user-3
content: 创建有问题，只是改变形参指向

user: user-4
content: #include <stdio.h> #include <stdlib.h>  typedef struct NODE { 	char data; 	struct NODE *next; } NODE;  /* void creatlist(NODE **head); void insert(NODE *head); void output(NODE *head);  */  void creatlist(NODE **head)	//创建一个只有表头节点的链表 { 	if(head == NULL || *head != NULL) 	{ 		// 	}  	*head = (NODE *)malloc(sizeof(NODE)); }  void insert(NODE *head) { 	static unsigned char counter = 1;  	// gen new node. 	NODE *p = (NODE *)malloc(sizeof(NODE)); 	//p->data=getchar(); 	p->data = counter++; 	p->next = NULL;  	// get last node. 	NODE *curr = head; 	NODE *next = head->next;  	while(next != NULL) 	{ 		curr = next; 		next = curr->next; 	} 	 	curr->next = p; }  void output(NODE *head) { 	NODE *p = head; 	//NODE *p = head->next;  	while(p != NULL) 	{ 		//putchar(p->data); 		printf("node data %d\n", p->data); 	 		p = p->next; 	} }  int main(int argc, char *argv[]) { 	NODE *head = NULL;  	creatlist(&head); 	for(int i=0; i<10; i++) 	{ 		insert(head); 	} 	output(head);  	return 0; }

user: user-5
content: #include <stdio.h> #include <stdlib.h>  typedef struct LNODE{     char data;     struct LNODE* next; }LNODE;   void creatlist(LNODE **head); void insert(LNODE **head); void output(LNODE* head);  int main(int argc, char* argv[]) {     LNODE* head = NULL;     creatlist(&head);     insert(&head);     output(head);     return 0;   } void creatlist(LNODE **head) {     *head = (LNODE*)malloc(sizeof(LNODE)); }  void insert(LNODE **head) {     LNODE* p = NULL;     p = (LNODE*)malloc(sizeof(LNODE));     p->data = getchar();     p->next=NULL;     p->next = (*head)->next;     (*head)->next = p; }  void output(LNODE *head) {     LNODE* p=NULL;      p = head->next;     while(p) {         putchar(p->data);         p=p->next;     }     putchar(10); }  两种解决办法，一种就是上面的修改； 另一种就是通过返回值，即创建和每次的插入都要返回链表的头指针。

user: user-6
content: 问题是在创建链表头那里的调用      LNODE* head=NULL;      creatlist(head);  //这里这样写就是把head指针变量存放的地址传进去了， 相当于createlist(NULL)    只要改成传指针变量本身的地址过去就可以了。   void creatlist(LNODE* *head); //用二级指针变量存放一级指针变量的地址        ....  int main(int argc,char* argv[]) {      LNODE* head=NULL;      creatlist(&head); //传指针变量本身的地址过去     .... }  void creatlist(LNODE* *head){       //创建一个只有表头节点的链表         *head=(LNODE*)malloc(sizeof(LNODE)); }

user: user-7
content: F10单步运行 F9断点 跟踪调试，写程序的必备技能。