注意❗
- 在循环之前为顺序表开辟结点空间;
- 循环结束之后修改顺序表的长度。
#include<stdio.h>
#include<malloc.h>
#include <stdlib.h>
#define maxsize 10
typedef int ElemType;
typedef int status;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
//*****************************************
typedef struct
{
ElemType *data;
int length;
}SqList;
void print(SqList A)
{
for(int i=0; i<A.length; i++)
printf("%d\n", A.data[i]);
}
//****************************************
LinkList creat()
{//使用尾插法建立带头结点的单链表;
LinkList L;
L = (LinkList)malloc(sizeof(LNode)); //开辟头结点空间
if(!L) printf("memory malloc error!\n");
LinkList p = L;
ElemType a;
int len;
printf("请输入待建表的表长:");
scanf("%d", &len);
if(len>0)
{
for(int i=0; i<len; i++)
{
printf("请输入第%d个元素的值:", i+1);
scanf("%d", &a);
p->next = (LinkList)malloc(sizeof(LNode));
p->next->data = a;
p = p->next;
}
}
p->next = NULL;
return L;
}
SqList merge(LinkList A, LinkList B)
{
SqList C;
C.data = NULL; C.length = 0; //初始化线性表C
if(A->next != NULL || B->next != NULL)
{
LinkList p = A->next;
LinkList q = B->next;
int i = 0;
C.data = (SqList *)malloc(sizeof(ElemType)*(maxsize));
if(!C.data) printf("开辟空间失败!");
while(p != NULL && q != NULL)
{
if(p->data == q->data)
{
C.data[i++] = p->data;
p = p->next;
q = q->next;
}
else if(p->data < q->data)
p = p->next;
else
q = q->next;
}
C.length = i;
printf("C.length=%d\n", C.length);
}
return C;
}
int main()
{
LinkList A = creat();
LinkList B = creat();
SqList C = merge(A, B);
print(C);
return 0;
}