问题太多了,实在是改不过来!!!!!
问题帮你注释了,真的是没法改。帮你修改的时间就可以重新写一个了//将两个链表连接起来
#include <stdio.h>
#include <malloc.h>
#define LEN sizeof(List) //这个定义是一个List node 的大小,并不是List长度
typedef struct node
{
int data;
struct node *next;
} List;
int main()
{
// 首先得到m和n的值
int m, n;
int count1, count2;
printf("请输入两个链表的长度m与n:");
scanf("%d %d", &m, &n);
List *L1;
List *L2;
L1 = NULL;
L2 = NULL;
List *ha, *hb, *hc;
//ha = (List*)malloc(LEN); //这样分配的空间只能存储一个List node. 下同
//hb = (List*)malloc(LEN);
//hc = (List*)malloc(LEN);
ha = (List *)malloc(m * LEN); //这样分配的才是m个结点的List,下同
hb = (List *)malloc(n * LEN);
hc = (List *)malloc((m + n) * LEN);
//ha = L1; //这三步执行完 ha = NULL, ha = NULL, hc = NULL,
//所以后面对ha,hb,hc的操作都是对NULL指针所指空间的操作,当然segmentation fault
//hb = L2;
//hc = L1;
L1 = ha;
L2 = hb;
hc = L1; // hc现在和L1指向同一个空间,上面为hc分配的空间就此放弃,永远也访问不到了!!!!!!
count1 = 0;
while (count1 < m) // count1没有赋初值,虽然大多数情况下默认值是0,但这样很不安全
{
scanf("%d", &ha->data);
ha = ha->next; //上面只是分配了存储List的空间,但是并没有建立处理链表结构,这是,ha->next的值并真的就是用空间。你这样做ha第二个往后的结点就访问不到了d//
count1++;
}
hb = ha; //hb和ha指向同一空间,
free(ha); // free(ha),相当于把hb,和 ha指向的那个结点空间释放了,那么hb,和ha指针都悬空了。你这样做ha第二个往后的结点就访问不到了
//执行完这一步, hb指向的空间已经被free了, 那么下面对hb的访问也就segmentation fault了
// 就算上面的都没问题了,当跳出上面的while时,ha指向的是L1的最后一个结点之后的结点, 下面的while访问hb时访问的就是个没有分配的空间
//
while (count2 < n)
{
scanf("%d", &hb->data);
hb = hb->next;
count2++;
}
hb = NULL; //这种赋值没有必要的,并不能节省空间
// 到目前为止,没看到链表拼接的任何操作
while (L1 != NULL) //这个循环永远不会结束。L1的值在整个循环中不会改变,也永远不可能等于NULL
{
do
{
printf("%d->",hc->data);
hc = hc->next;
} while (hc != NULL);
// 这个内层循环跳出后会在外层while中一直空转。你这内层循环和外层循环有什么关系吗。
}
return 0;
|