user-0 提问: 本人菜鸟一枚，自学Linux c中，简单的链表程序却不停出错，求解。

回复:
user: user-1
content: 仅供参考  //LinkList.h #ifndef LINKLIST_H_ #define LINKLIST_H_  #ifndef constant #define constant  #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2  #include <stdlib.h> typedef int Status;  #endif /* constant */  typedef int LLElemType;  typedef struct LNode{ 	LLElemType data; 	struct LNode *next; }LNode,LinkList;  Status InitList_Link(LinkList **L); Status CreateListF_Link(LinkList **L,LLElemType elem[],int n); LinkList* CreateListFF_Link(LLElemType elem[],int n); Status CreateListR_Link(LinkList **L,LLElemType elem[],int n); LinkList* CreateListRR_Link(LLElemType elem[],int n); Status DestroyList_Link(LinkList *L); Status ClearList_Link(LinkList *L); int EmptyList_Link(LinkList *L); int LengthList_Link(LinkList *L); Status GetElem_Link(LinkList *L,int i,LLElemType *e); int LocateElem_Link(LinkList *L,LLElemType e); Status InsertList_Link(LinkList *L,int i,LLElemType e); Status DeleteList_Link(LinkList *L,int i,LLElemType *e);  #endif /* LINKLIST_H_ */  //LinkList.c #include "LinkList.h"  Status InitList_Link(LinkList **L){ 	*L=(LinkList *)malloc(sizeof(LinkList)); 	(*L)->next=NULL; 	return OK; }  Status CreateListF_Link(LinkList **L,LLElemType elem[],int n){ 	LNode *p; 	int i; 	*L=(LinkList *)malloc(sizeof(LinkList)); 	(*L)->next=NULL; 	for(i=0;i<n;i++){ 		p=(LNode *)malloc(sizeof(LNode)); 		p->data=elem[i]; 		p->next=(*L)->next; 		(*L)->next=p; } 	return OK; }  LinkList* CreateListFF_Link(LLElemType elem[],int n){ 	LNode *head,*p; 	int i; 	head=(LinkList *)malloc(sizeof(LinkList)); 	head->next=NULL; 	for(i=0;i<n;i++) 	{ 		p=(LNode *)malloc(sizeof(LNode)); 		p->data=elem[i]; 		p->next=head->next; 		head->next=p; 	} 	return head; }  int CreateListR_Link(LinkList **L,LLElemType elem[],int n){ 	LNode *p,*q; 	int i; 	*L=(LinkList *)malloc(sizeof(LinkList)); 	p=*L; 	for(i=0;i<n;i++){ 		q=(LNode *)malloc(sizeof(LNode)); 		q->data=elem[i]; 		p->next=q; 		p=q; 	} 	p->next=NULL; 	return OK; }  LinkList* CreateListRR_Link(LLElemType elem[],int n){ 	LNode *head,*p,*q; 	int i; 	head=(LinkList *)malloc(sizeof(LinkList)); 	p=head; 	for(i=0;i<n;i++){ 		q=(LNode *)malloc(sizeof(LNode)); 		q->data=elem[i]; 		p->next=q; 		p=q; 	} 	p->next=NULL; 	return head; }  Status DestroyList_Link(LinkList *L){ 	LNode *p,*q; 	p=L;q=p->next; 	while(q!=NULL){ 		free(p); 		p=q; 		q=q->next; } 	free(p); 	return OK; }  Status ClearList_Link(LinkList *L){ 	LNode *p,*q; 	p=L; 	while(p->next!=NULL){ 		q=p->next; 		p->next=q->next; 		free(q); } 	return OK; }  int EmptyList_Link(LinkList *L){ 	return L->next==NULL; }  int LengthList_Link(LinkList *L){ 	int n=0; 	LNode *p=L; 	p=p->next; 	while(p!=NULL){ 		n++; 		p=p->next; 	} 	return n; }  Status GetElem_Link(LinkList *L,int i,LLElemType *e){ 	int n=0; 	LNode *p; 	if(i<1 ||i>LengthList_Link(L)) return ERROR; 	p=L->next; 	while(p!=NULL){ 		if ((n++)==i-1) 			*e=p->data;    p=p->next; 	} 	return OK; }  int LocateElem_Link(LinkList *L,LLElemType e){ 	LNode *p; 	int n=0; 	p=L->next; 	while(p!=NULL){ 		n++; 		if(e==p->data) 			return n; 		else 			p=p->next; 	} 	return 0; }  Status InsertList_Link(LinkList *L,int i,LLElemType e){ 	int n=0; 	LNode *p,*q; 	if(i<1 || i>LengthList_Link(L)+1) return ERROR; 	p=L; 	while(n<i-1 && p!=NULL){ 		n++; 		p=p->next; } 	q=(LNode *)malloc(sizeof(LNode)); 	q->data=e; 	q->next=p->next; 	p->next=q; 	return OK; }  Status DeleteList_Link(LinkList *L,int i,LLElemType *e){ 	int n=0; 	LNode *p,*q; 	if(i<1 || i>LengthList_Link(L)) return ERROR; 	p=L; 	while(n<i-1 && p!=NULL){ 		n++; 		p=p->next; 	} 	q=p->next; 	p->next=q->next; 	*e=q->data; 	free(q); 	return OK; }  //mainTest.c #include "LinkList.h" #include <stdio.h> int main(){ 	LinkList *L; 	int i; 	LLElemType ee; 	InitList_Link(&L); 	for(i=0;i<10;i++){ 		InsertList_Link(L,(i+1),2*i+1); 	} 	GetElem_Link(L,1,&ee); 	printf("%d\n",ee); 	printf("%d\n",LengthList_Link(L)); 	DestroyList_Link(L); 	return 0; }

user: user-2
content: 仅供参考//带表头结点的单向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> struct NODE {     int          data;     struct NODE *next; } H,*head,*p,*q,*s1,*s2,*s3,*s4,*s; int i,j,k,n,t,m; int main() {     srand(time(NULL));      //填写头节点数据     H.data=-1;     H.next=NULL;     head=&H;      //创建10个节点的单链表     p=head;     for (i=0;i<10;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) return 1;         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         p->next=q;         p=q;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将值为5的结点插入到单链表的第k个结点前     k=3;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) return 1;             q->data=5;             q->next=p->next;             p->next=q;             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //删除第k个节点     k=5;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=p->next;             if (q) {                 p->next=q->next;                 free(q);             }             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //从小到大排序     for (p=head;p!=NULL && p->next!=NULL;p=p->next) {         for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {             if (p->next->data > q->next->data) {                  //交换data //              printf("swap %02d %02d\n",p->next->data,q->next->data); //              t=p->next->data;p->next->data=q->next->data;q->next->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->next->data,q->next->data);                 s1=p->next;                 s2=p->next->next;                 s3=q->next;                 s4=q->next->next;                  if (s2!=s3) {                      p->next=s3;                     s3->next=s2;                      q->next=s1;                     s1->next=s4;                 } else {                      p->next=s3;                     s3->next=s1;                            q=s3;                     s1->next=s4;                 }                  //输出整个单链表 //              s=head->next; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10     m=4;     n=6;     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m+1==k) {             q=p;         }         s=p;         p=p->next;     }     s1=head->next;     head->next=q->next;     s->next=s1;     q->next=NULL;      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head->next;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //18->94->58->17->27->20->43->57->75->78-> //18->94->05->58->17->27->20->43->57->75->78-> //18->94->05->58->27->20->43->57->75->78-> //05->18->20->27->43->57->58->75->78->94-> //43->57->58->75->78->94->05->18->20->27-> //

user: user-3
content: 实参中L本身为地址,&L为地址的地址,

user: user-0
content: 我编程很少，而且对链表部分很不熟，我看的那本书上说的是形参部分为：Linklist &L，我觉得他这样做不对，形参应该匹配实参，而实参传递的是一个地址Linklist（&L），所以形参必为一个指针接受实参传递的“值”，这样理解对吗？

user: user-4
content: 我刚自己学了会单链表，我把我代码也帖出来吧，看看有没有用。#include <iostream> using namespace std; #include <ctime>  //链表的数据准备 typedef struct ListNode  { 	int n_nkey; 	ListNode * pNext; }Node;  //追加结点：首先分配内存空间，保存新增的结点 //			从头指针head开始逐个检查，直到找到最后一个结点 //			将表尾结点的地址设置为新增结点的地址 //			将新增结点的地址部分设置为空地址null,即新结点成为表尾 Node * NodeAdd(Node * head,int n) { 	Node * p1,* p2; 	if (!(p1 = new Node[sizeof(Node)])) 	{ 		cout<<"申请内存失败！\n"; 		return NULL; 	}else 	{ 		//把p1设置成表尾 		p1->n_nkey = n; 		p1->pNext = NULL; 		if (head == NULL)//头指针 		{ 			head = p1; 			return head; 		} 		p2 = head; 		//查找链表的末尾 		while (p2->pNext != NULL) 		{ 			p2 = p2->pNext; 		} 		p2->pNext = p1; 		return head; 	} }  //插入头结点：首先分配内存空间，保存新增的结点 //			使新增结点指向头指针head所指向的结点 //			然后使头指针head指向新增结点 Node * NodeAddFirst(Node *head,int n) { 	Node * p1; 	if (!(p1 = new Node[sizeof(Node)])) 	{ 		cout<<"申请内存失败!\n"; 		return NULL; 	}else 	{ 		p1->n_nkey = n; 		//指向头指针所指结点 		p1->pNext = head; 		//头指针指向新增结点 		head = p1; 		return head; 	} }  //查找结点 Node * FindNode(Node * head,int key) { 	Node * pTemp; 	//保存链表头指针 	pTemp = head; 	while (pTemp)	//若结点有效，则进行查找 	{ 		if (pTemp->n_nkey == key)	//诺结点关键字与传入关键字相同 		{ 			return pTemp; 		} 		pTemp = pTemp->pNext; 	} 	return NULL; }  //插入结点:首先分配内存空间，保存新增结点 //			找到要插入的逻辑位置，也就是位于哪两个结点之间 //			修改插入位置结点的指针，使其指向新增结点，而使新增结点指向原插入位置所指向的结点 Node * InsertNode(Node *head,int findkey,int n) { 	Node * p1,*p2; 	//分配保存结点的内容 	if (!(p1 = new Node[sizeof(Node)])) 	{ 		cout<<"申请内存失败!\n"; 		return NULL; 	} 	p1->n_nkey = n; 	p2 = FindNode(head,findkey); 	if (p2)//成功找到结点 	{ 		p1->pNext = p2->pNext; 		p2->pNext = p1; 	}else 	{ 		cout<<"未找到正确的插入位置!\n"; 		delete [] p1; 	} 	return head; }  //删除结点:查找到需要删除的结点 //			使前一结点指向当前结点的下一结点 //			删除结点。 int DeleteNode(Node *head,int key) { 	Node *p1,*p2;					//p1保存删除结点的前一结点 	p2 = head; 	p1 = head; 	while (p2) 	{ 		if (p2->n_nkey == key) 		{ 			p1->pNext = p2->pNext; 			delete p2; 			return 1; 		}else 		{ 			p1 = p2; 			p2 = p2->pNext; 		} 	} 	return 0; }  //计算链表长度 int NodeLength(Node *head) { 	Node *pTemp; 	int Len =0; 	pTemp = head; 	while (pTemp)	//遍历整个链表 	{ 		Len ++; 		pTemp = pTemp->pNext; 	} 	return Len; }  //显示所有结点 void ALLNode(Node * head) { 	Node * pTemp; 	int Num; 	pTemp = head; 	while (pTemp) 	{ 		Num	= pTemp->n_nkey; 		cout<<Num<<" "; 		pTemp = pTemp->pNext; 	} 	cout<<endl; }  //删除重复结点:先排序，然后如果相邻两个相等则删除后面哪个 Node * DeleteRepetitionNode(Node * head) { 	//对链表进行排序 	int nLen = NodeLength(head); 	Node *P1,*P2; 	P1 = head; 	if (nLen<2) 	{ 		return head; 	} 	//此时nLen不小于2，则p2 = p1.pNext存在 	for (int i=0;i<nLen;i++) 	{ 		P1 = head; 		while (P1->pNext != NULL) 		{ 			//两两比较 			P2 = P1->pNext; 			if (P1->n_nkey > P2->n_nkey) 			{ 				int temp = P1->n_nkey; 				P1->n_nkey = P2->n_nkey; 				P2->n_nkey = temp; 			} 			if (P2->pNext != NULL) 			{ 				P1 = P1->pNext; 			}else 			{ 				P1 = P1->pNext; 				break; 			} 		} 	} 	//删除重复数据，记得要更新p1 p2 	P1 = head; 	while (P1->pNext != NULL) 	{ 		//两两比较 		P2 = P1->pNext; 		if (P1->n_nkey == P2->n_nkey) 		{ 			//把第二个结点的指针赋值给前一个结点 			P1->pNext = P2->pNext; 			delete P2; 		}else 		{ 			P1 = P1->pNext; 		} 	} 	return head; } int main() { 	srand(time(0)); 	Node *node,*head = NULL; 	//通过追加结点的方式添加10个结点 	for (int i=0;i<10;i++) 	{ 		int N = rand()/1000; 		head = NodeAdd(head,N); 	} 	//显示所有结点 	ALLNode(head); 	//删除重复结点 	head = DeleteRepetitionNode(head); 	//显示所有结点 	ALLNode(head); 	return 0; }

user: user-5
content: 应该是参数传递有问题，在创建链表的的参数里，应该传递L的地址，这样才能将链表的头结点得到，即需要L参数即是一个传入参数也需要是一个传出参数，或者另一种方式通过返回值。

user: user-6
content: 不能老是以菜鸟作为借口，代码风格太差了，应该加强编码规范的学习。可以参考如下《C/C++语言编码规范》 http://blog.csdn.net/wenrenhua08/article/details/39591285

user: user-7
content: mark 迟点来看

user: user-8
content: 仅供参考 http://yun.baidu.com/s/17yIcQ

user: user-0
content: 我初次打的代码是和你说的一样的，但是出错，改了之后就不出错，所以。。。我看书多，却没练习，多谢提醒。

user: user-0
content: 那么这个错误时怎么回事呢，大牛？

user: user-9
content: 引用 2 楼 liangrongyao 的回复:那么问题又来了 liang@ubuntu:~$ gcc -g -o 1 ~/Desktop/创建链表.c /home/liang/Desktop/创建链表.c:8:27: error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token /home/liang/Desktop/创建链表.c:13:29: error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token liang@ubuntu:~$  这是改完之后的，而且我的LinkList是一个指向节点类型的指针，不是值传递吧？谢谢。  呵呵，你没搞懂什么叫值传递 ，LinkList是一个指针类型，如果你在函数内是要改变它所指向的值当然不叫值传递了，问题是你要改变是指针本身，这就是值传递。别要像书呆子一样以为只要传是指针就不是值传递了。

user: user-0
content: 那么问题又来了 liang@ubuntu:~$ gcc -g -o 1 ~/Desktop/创建链表.c /home/liang/Desktop/创建链表.c:8:27: error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token /home/liang/Desktop/创建链表.c:13:29: error: expected ‘;’, ‘,’ or ‘)’ before ‘&’ token liang@ubuntu:~$  这是改完之后的，而且我的LinkList是一个指向节点类型的指针，不是值传递吧？谢谢。

user: user-9
content: 访问内存出错，因为你的参数是LinkList, 是值传递，你在函数内部改变它是没有意思的，函数结束后它就变回原值了。  将所有函数的参数 LinkList L 改成 LinkList &L