user-0 提问: 数据结构（C语言）单向链表

回复:
user: user-0
content: 谢谢，但是最后归并还是出现问题了，不过现在已经很好了，谢谢谢谢

user: user-1
content: 你的InitList_L，CreatList_L，CreatList_L1这三个函数都是不对的。 你要在函数内改变指针的指向，必须传一级指针或者一级指针  #include <stdio.h> #include <stdlib.h> #define TRUE	1 #define FALSE	0 #define OK	1 #define ERROR	0 #define INFEASIBLE	-1 #define OVERFLOW	-2  typedef int Status; typedef int ElemType;  typedef struct  LNode { 	ElemType data; 	struct LNode *next; }LNode, *LinkList;  //1.初始化单链表 void  InitList_L(LinkList *L) {   	*L = (LinkList)malloc(sizeof(LNode)); 	if (!L) 		printf("分配空间失败"); 	(*L)->next = NULL; }   //2.销毁单链表 void DestroyList_L(LinkList L) { 	free(L);  } //3.置空单链表 Status ClearList_L(LinkList L) {   	if (!L->next) 	{ 		printf("该链表已经为空,无需再置空！\n"); 		return ERROR; 	} 	else 		free(L->next);  	L->next = NULL; 	return OK; } //4.判断单链表是否为空 Status ListEmpty_L(LinkList L) {  	if (L->next == NULL) 	{ 		printf("该链表为空！\n"); 		return OK; 	} 	else 	{ 		printf("该链表不为空！\n"); 		return ERROR; 	}  } //5. 求单链表的长度 Status ListLength_L(LinkList L) { 	int i = 0; 	LNode *p; 	p = L; 	while (p->next) 	{ 		i++; 		p = p->next; 	}  	return i; }  //6.取单链表中的第i个数据元素 Status GetElem_L(LinkList L, int i) { 	LNode *p; 	int j; 	ElemType e; 	p = L->next; j = 1; 	while (p  && j<i) 	{ 		p = p->next; 		j++; 	} 	if (!p || j>i) 	{ 		printf("位置错误!\n"); 		return ERROR; 	} 	e = p->data; 	printf("链表中的第%d个位置上的数据元素为%d。\n", i, e); 	return e; }  //7.对单链表中的第i个数据元素重新赋值 Status PutElem_L(LinkList L, int i, ElemType  *e) { 	LNode *p; 	int j;  	p = L->next; j = 1; 	while (p  && j<i) 	{ 		p = p->next; 		j++; 	} 	if (!p || j>i) 	{ 		printf("位置错误!\n"); 		return ERROR; 	} 	p->data = *e; 	return *e; }   //8.在单链表的第i个位置之前插入数据元素e Status ListInsert_L(LinkList L, int i, ElemType *e) { 	LNode *p, *s; 	int j = 0; 	p = L; 	while (p && j< i - 1) 	{ 		p = p->next; 		j++; 	}   //寻找第i-1个结点 	if (!p || j>i - 1) 	{ 		printf("插入位置错误！\n"); 		return ERROR; 	} 	s = (LinkList)malloc(sizeof(LNode)); 	s->data = *e; 	s->next = p->next; 	p->next = s;   //插入结点 	return OK; }  //9.删除单链表的第i个位置上数据元素e Status ListDelete_L(LinkList L, int i, ElemType *e) { 	LNode *p, *q; 	int j = 0; 	p = L; 	while (p->next  && j<i - 1) 	{ 		p = p->next; 		j++; 	}  //寻找第i-1个结点 	if (!p->next || j>i - 1) 	{ 		printf("删除位置错误！\n"); 		return ERROR; 	} 	q = p->next; 	p->next = q->next; 	*e = q->data; 	printf("删除的数据元素的值=%d", *e); 	free(q); 	return *e; }  //10.按顺序输出元素 void Output_L(LinkList L) { 	LNode  *p;  	p = L->next; 	printf("链表元素依次为:  "); 	while (p) 	{ 		printf("%-5d", p->data); 		p = p->next; 	} 	printf("ERROR"); 	printf("\n"); }  //11.创建带头结点的单链表(表头插入) void  CreatList_L(LinkList *L, int n) { 	LNode *p; 	int i; 	InitList_L(L); 	printf("请输入%d个数：", n); 	for (i = n; i>0; i--) 	{ 		p = (LinkList)malloc(sizeof(LNode)); 		scanf("%d", &p->data); 		p->next = (*L)->next; 		(*L)->next = p; 	} 	//p->next=NULL; }  //12.创建带头结点的单链表(尾部插入) void  CreatList_L1(LinkList *L, int n) { 	LNode *p, *q; 	int i; 	InitList_L(L); 	q = *L; 	printf("请输入%d个数：", n); 	for (i = 0; i<n; i++) 	{ 		p = (LinkList)malloc(sizeof(LNode)); 		scanf("%d", &p->data); 		p->next = q->next; 		q->next = p; 		q = q->next; 	} 	q->next = NULL;  }  //13.将两个有序的链表合并为一个有序链表 void MergeList_L(LinkList La, LinkList Lb, LinkList Lc) { 	LNode *pa, *pb, *pc; 	pa = La->next; 	pb = Lb->next; 	Lc = pc = La; 	while (pa && pb) 	{ 		if (pa->data <= pb->data) 		{ 			pc->next = pa; pc = pa; pa = pa->next; 		} 		else 		{ 			pc->next = pb; pc = pb; pb = pb->next; 		} 	} 	pc->next = pa ? pa : pb; 	free(Lb);  } void zhujiemian() { 	printf("=============================================================== \n"); 	printf("	     顺序表基本操作\n"); 	printf("--------------------------------------------------------------- \n"); 	printf("1.初始化单链表                   2.销毁单链表\n"); 	printf("3.置空单链表                     4.判断是否为空\n"); 	printf("5.求单链表长度                   6.取第i个位置上的数据元素\n"); 	printf("7.为第i个数据元素的赋新值e       8.插入数据元素\n"); 	printf("9.删除第i个元素                  10.输出数据元素\n"); 	printf("11.创建单链表（表头插入）        12.创建单链表（表尾插入）\n"); 	printf("13.归并两个有序表                0.退出	\n"); 	printf("================================================================= \n");  }   int main() { 	LinkList L = NULL, La = NULL, Lb = NULL, Lc = NULL; 	int n, i, select, e, cur_e;  	zhujiemian(); 	while (1) 	{ 		printf("\n请输入选项："); 		scanf("%d", &select); 		switch (select) 		{ 		case 0: 			exit(0); 			break; 		case 1: 			InitList_L(&L); 			break; 		case 2: 			DestroyList_L(L); 			break; 		case 3: 			ClearList_L(L); 			break;  		case 4: 			ListEmpty_L(L); 			break; 		case 5: 			printf("链表的长度为%d \n", ListLength_L(L)); 			break; 		case 6: 			printf("请输入位置i "); 			scanf("%d", &i); 			GetElem_L(L, i); 			break; 		case 7: 			printf("请输入位置i和数据元素e: "); 			scanf("%d%d", &i, &e); 			PutElem_L(L, i, &e); 			break; 		case 8: 			printf("请输入插入位置i 和插入的数据元素e："); 			scanf("%d%d", &i, &e); 			ListInsert_L(L, i, &e); 			break; 		case 9: 			printf("请输入删除位置："); 			scanf("%d", &i); 			ListDelete_L(L, i, &e); 			break; 		case 10: 			Output_L(L); 			break; 		case 11: 			printf("请输入链表中所包含的数据元素的个数 n="); 			scanf("%d", &n); 			CreatList_L(&L, n); 			break; 		case 12: 			printf("请输入链表中所包含的数据元素的个数 n="); 			scanf("%d", &n); 			CreatList_L1(&L, n); 			break; 		case 13: 			printf("请输入链表La中所包含的数据元素的个数 na="); 			scanf("%d", &n); 			CreatList_L1(&La, n); 			printf("请输入链表Lb中所包含的数据元素的个数 nb="); 			scanf("%d", &n); 			CreatList_L1(&Lb, n); 			MergeList_L(La, Lb, Lc); 			printf("归并后:"); 			Output_L(Lc); 			break; 		default: 			zhujiemian(); 			break; 		}  	} 	return 0; }

user: user-0
content: 如果是传入&L 就会报错，这个肯定不对吧

user: user-0
content: Linklist 是结构体指针啊，指针传递啊，不是值传递吧

user: user-2
content: 你的InitList_L函数是按值传递的，形参只是实参的一个复制品 你在InitList_L中分配内存不影响到主函数中的L