题目为:实现两个有序表合并后仍然有序的功能
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int ElemType;
struct LNode
{
ElemType data;
struct LNode *next;
};
typedef struct LNode*LinkList;
LinkList Create_Link()/*创建链表的函数,返回的是头指针*/
{
char ch;
struct LNode *head=NULL,*p1,*p2;
while(1)
{
p1=(struct LNode*)malloc(sizeof(struct LNode));
p1->next=NULL;
scanf("%d%c",&p1->data,&ch);
if(head==NULL)
{
head=p1;
p2=p1;
}
else
{
p2->next=p1;
p2=p1;
}
if(ch=='\n')
break;
}
return (head);
}
Status ListLength(LinkList L)/*计算链表长度的函数*/
{
int length=0;
struct LNode *p1;
p1=L;
while(p1!=NULL)
{
length++;
p1=p1->next;
}
return length;
}
Status GetElem(LinkList L,int i,ElemType*e)/*该函数取第i个元素赋给e,e用于后续比较*/
{
int j=1;
LinkList p=L;
while(p&&j<i)/*while(p!=NULL&&j<i),找到第i个数据*/
{
p=p->next;
j++;
}
if(!p||j>i)/*if(p=NULL||j>i),如果已经退出了循环,说明在循环中没有找到数据*/
return ERROR;
*e=p->data;
return OK;
}
void ListInsert(LinkList **L,int j,ElemType e)/*在链表中插入数据*/
{
int i=0;
struct LNode *p1,*p2,*p;
p1=**L;
p2=**L;
p=(struct LNode*)malloc(sizeof(struct LNode));
p->next=NULL;
p->data=e;
if(j==ListLength(**L)+1)
{
while(p1!=NULL)
{
p2=p1;
p1=p1->next;
}
p2->next=p;
}
else
{
if(j-1==0)
{
p->next=p1;
**L=p;
}
else
{
while(i<j)
{
p2=p1;
p1=p1->next;
}
p->next=p1;
p2->next=p;
}
}
}
Status ListEmpty(LinkList L)/*判断是否为空表*/
{
if(L->next)
return FALSE;
else
return TRUE;
}
void MergeList (LinkList La,LinkList Lb,LinkList *Lc)
{
int i=1,j=1,k=0;
int La_len,Lb_len;
int a,b;
La_len=ListLength(La);
Lb_len=ListLength(Lb);
while(i<=La_len&&j<=Lb_len)
{
GetElem(La,i,&a);
GetElem(Lb,j,&b);
if(a<=b)
{
ListInsert(&Lc,++k,a);
++i;
}
else
{
ListInsert(&Lc,++k,b);
++j;
}
}
while(i<=La_len)
{
GetElem(La,i++,&a);
ListInsert(&Lc,++k,a);
}
while(j<=Lb_len)
{
GetElem(Lb,j++,&b);
ListInsert(&Lc,++k,b);
}
}
int main()
{
struct LNode *p1;
LinkList La,Lb,Lc;
La=Create_Link();
Lb=Create_Link();
if(!ListEmpty(La)&&!ListEmpty(Lb))
{
MergeList(La,Lb,&Lc);
}
p1=La;
while(p1!=NULL)
{
printf("%d ",p1->data);
p1=p1->next;
}
return 0;
}
这段代码到底哪里错了啊,为什么输出为空啊?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
3条回答 默认 最新
IT_service_mesh 2023-03-26 20:39关注参考GPT和自己的思路:该代码中的问题在于,在主函数中打印链表La的元素时,没有将指针p1指向链表Lc,而是仍然指向了链表La,因此输出为空。解决方法是将指针p1指向链表Lc。修改后的代码如下:
int main() { struct LNode *p1; LinkList La,Lb,Lc; La=Create_Link(); Lb=Create_Link(); if(!ListEmpty(La)&&!ListEmpty(Lb)) { MergeList(La,Lb,&Lc); } p1=Lc; // 将指针p1指向链表Lc while(p1!=NULL) { printf("%d ",p1->data); p1=p1->next; } return 0; }评论 打赏 举报解决 1无用