#define LINELIST_INIT 100
#define LIST_INCREMENT 10
这两个宏并没有使用,本代码可正常运行,如有错误请指正,别忘记评论 点赞 收藏
typedef struct
{
int * line;
int length;
int List_size;
}LineList,* LinkLine;
LinkLine Init_LineList(int e);//初始化顺序表
void Add_LineList(LinkLine L,int e);//添加元素
void PrintLineList(LinkLine L);//打印元素
void InsertLine (LinkLine L,int i,int e);//插入元素e为位置不是下标
int DeleteLine (LinkLine L,int p);//删除元素
int LocateElem(LinkLine L,int e);//定位元素位置,不是下标
int GetElem(LinkLine L,int p);//得到某位置元素
int Empty(LinkLine L);//判断是否为空
void sort(LinkLine L);//冒泡排序从小到大
void DestoryLine(LinkLine L);//销毁分配空间
LinkLine MergeLinelist(LinkLine L1,LinkLine L2);//合并2个表为一个表
LinkLine MergeLinelistPlus(LinkLineL1,LinkLine L2);//合并2个表为一个表plus版,重复元素去掉
#include<stdio.h>
#include<stdlib.h>
// #define LINELIST_INIT 100
// #define LIST_INCREMENT 10
//可忽略
typedef struct
{
int * line;
int length;
int List_size;
}LineList,* LinkLine;
LinkLine Init_LineList(int e);//初始化顺序表
void Add_LineList(LinkLine L,int e);//添加元素
void PrintLineList(LinkLine L);//打印元素
void InsertLine (LinkLine L,int i,int e);//插入元素e为位置不是下标
int DeleteLine (LinkLine L,int p);//删除元素
int LocateElem(LinkLine L,int e);//定位元素位置,不是下标
int GetElem(LinkLine L,int p);//得到某位置元素
int Empty(LinkLine L);//判断是否为空
void sort(LinkLine L);//冒泡排序从小到大
void DestoryLine(LinkLine L);//销毁分配空间
LinkLine MergeLinelist(LinkLine L1,LinkLine L2);//合并2个表为一个表
LinkLine MergeLinelistPlus(LinkLine L1,LinkLine L2);//合并2个表为一个表plus版,重复元素去掉
LinkLine Init_LineList(int e)
{
LinkLine L1;int num = 0;
L1=(LinkLine)malloc(sizeof(LineList));
if ( e == 0)
{
printf("error");
return NULL;
}
L1->line = (int *)malloc(e*sizeof(int));
L1->List_size = e;
L1->length = 0;
return L1;
}
void Add_LineList(LinkLine L,int e)
{
int num = 0;
int size = 0,Needsize = 0;
size = L->List_size - L->length;
if ((size) <= e)
{
Needsize = e - size;
L->line = (int *)realloc(L->line,sizeof(int) * (L->List_size+Needsize+10));
L->List_size = L->List_size+Needsize+10;
}
printf("ADD: Please input you want add value of LineList\n");
for (int i = 0; i < e; i++)
{
scanf("%d",&num);
L->line[L->length] = num;
L->length++;
}
}
void InsertLine (LinkLine L,int p,int e)
{
int temp = 0;
int size = 0,Needsize = 0;
size = L->List_size - L->length;
if (p < 1 || p>L->length + 1)
{
printf("error ");
return ;
}
if (size <= 0)
{
L->line = (int *)realloc(L->line,sizeof(int) * (L->List_size+Needsize+10));
L->List_size = L->List_size+Needsize+10;
}
for(int i = (L->length+1);i > (p-1);i--)
{
L->line[i] = L->line[i-1];
}
L->line[p-1] = e;
L->length++;
}
int DeleteLine (LinkLine L,int p)
{
int temp = L->line[p-1];
for(int i = p-1;i<L->length-1;i++)
{
L->line[i] = L->line[i+1];
}
L->length--;
return temp;
}
int LocateElem(LinkLine L,int e)
{
int Key=-1;
for(int i = 0;i<L->length;i++)
{
if(L->line[i] == e)
{
Key = i;
break;
}
}
if(Key != -1)
{
return (Key+1);
}
else
{
return 0;
}
}
int GetElem(LinkLine L,int p)
{
if(p<1 || p>L->length)
{
printf("error");
return NULL;
}
return L->line[p-1];
}
int Empty(LinkLine L)
{
if(L->line==NULL || L==NULL || L->List_size==NULL)
{
return 1;
}
else
{
return 0;
}
}
void sort(LinkLine L)
{
int temp;
for (int i = 0;i<L->length;i++)
{
for (int j = i+1; j < L->length; j++)
{
if (L->line[i]>L->line[j])
{
temp = L->line[i];
L->line[i] = L->line[j];
L->line[j] = temp;
}
}
}
}
LinkLine MergeLinelist(LinkLine L1,LinkLine L2)
{
int i = 0,j = 0,k = 1;
int L1Len =L1->length,L2Len = L2->length;
int L3len = L1Len + L2Len;
LinkLine L3 = Init_LineList(L3len);
sort(L1);
sort(L2);
while (i<L1Len && j<L2Len)
{
if (L1->line[i]<L2->line[j])
{
InsertLine(L3,k,L1->line[i]);
i++;
}
else
{
InsertLine(L3,k,L2->line[j]);
j++;
}
k++;
}
while (i < L1Len)
{
InsertLine(L3,k,L1->line[i]);
i++;
k++;
}
while (j < L2Len)
{
InsertLine(L3,k,L2->line[j]);
j++;
k++;
}
return L3;
}
LinkLine MergeLinelistPlus(LinkLine L1,LinkLine L2)
{
int i = 0,j = 0,k = 1;
int L1Len =L1->length,L2Len = L2->length;
int L3len = L1Len + L2Len;
LinkLine L3 = Init_LineList(L3len);
sort(L1);
sort(L2);
while (i<L1Len && j<L2Len)
{
if (L1->line[i] < L2->line[j])
{
if(k > 1)
{
if(L3->line[k-2] == L1->line[i])
{
i++;
}
else
{
InsertLine(L3,k,L1->line[i]);
i++;
k++;
}
}
else
{
InsertLine(L3,k,L1->line[i]);
i++;
k++;
}
}
else if (L1->line[i] == L2->line[j])
{
if(k > 1)
{
if(L3->line[k-2] == L1->line[i])
{
j++;
i++;
}
else
{
InsertLine(L3,k,L1->line[i]);
i++;
j++;
k++;
}
}
else
{
InsertLine(L3,k,L2->line[j]);
j++;
i++;
k++;
}
}
else
{
if(k > 1)
{
if(L3->line[k-2] == L2->line[j])
{
j++;
}
else
{
InsertLine(L3,k,L2->line[j]);
j++;
k++;
}
}
else
{
InsertLine(L3,k,L2->line[j]);
j++;
k++;
}
}
}
while (i < L1Len)
{
InsertLine(L3,k,L1->line[i]);
i++;
k++;
}
while (j < L2Len)
{
InsertLine(L3,k,L2->line[j]);
j++;
k++;
}
return L3;
}
void DestoryLine(LinkLine L)
{
free(L->line);
L->line=NULL;
free(L);
L = NULL;
}
void PrintLineList(LinkLine L)
{
for (int i = 0;i < L->length;i++)
{
printf("%d ",(L->line[i]));
}
}
int main ()
{
int n,add,add1,num;
LinkLine L1 = NULL;
LinkLine L2 = NULL;
printf("INIT: Please input you want size of LineList1\n");
scanf("%d",&n);
L1 = Init_LineList(n);
printf("ADD: Please input you want add count of LineList1\n");
scanf("%d",&add);
Add_LineList(L1,add);
printf("INIT: Please input you want size of LineList2\n");
scanf("%d",&n);
L2 = Init_LineList(n);
printf("ADD: Please input you want add count of LineList2\n");
scanf("%d",&add);
Add_LineList(L2,add);
// printf("\n%d",L->length);
// printf("\n%d\n",L->List_size);
// printf("\n%d",L->length);
// printf("\n%d\n",L->List_size);
// InsertLine(L,6,90);
// DeleteLine(L,2);
// printf("\n%d",L->length);
LinkLine L3 = MergeLinelistPlus(L1,L2);
DestoryLine(L1);
DestoryLine(L2);
DestoryLine(L3);
PrintLineList(L3);
system("pause");
return 0;
}