数据结构:顺序表

#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;
}

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值