两个顺序表首尾相接(合并)的方法

暗红色部分顺序表合并的方法实现

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>   //有一些编译器可能不需要引入malloc.h头文件

#define LIST_INIT_SIZE    100
#define LISTINCREMENT     10

typedef struct{
        int length;
        int *elem ;
        int listsize;
}SqList;

SqList InitList_Sq(SqList L){
    L.elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
    int k = 0;
    if(!L.elem)exit(1);
    L.length = 0;
    L.listsize = LIST_INIT_SIZE;
    return L;
//在顺序线性表L中第i个位置之前插入新的元素e 
//线性表的顺序表示在插入元素的时候需要把插入位置之后的元素都向后移动一个位置 
//L:将要被操作的线性表,i要插入的位置,e要插入的元素 
SqList ListInsert_Sq(SqList L,int i ,int e){
    
    printf("被插入的元素是%d\n",e);
    //首先判断i值是否合法
    if(i<1||i>L.length+1){printf("你选择要插入的位置已经超出了线性表的界限\n");return L;}
    if(L.length >= L.listsize){
        int *newbase = (int *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));
        if(!newbase)exit(1);
        L.elem = newbase;
        L.listsize = L.listsize+LISTINCREMENT;
        printf("内存不足,需要扩充"); 
    } 
    int *q = (L.elem+i-1);//要插入的位置 
    printf("插入位置的当前值是 %d\n", *q); 
    int *p;
    if(L.length>0)
    for (p = (L.elem+(L.length-1));p>=q;--p)
    {
    printf("表尾的元素值是%d\n",*(L.elem+(L.length-1)));
    *(p+1) = *p;//从最后一个元素开始把元素依次向后移动一个位置 
    printf("被移动的元素是%d\n",*(p+1));
    }
    *q = e;
    ++L.length;
    return L ;
}

SqList ListDelete_Sq(SqList L,int i){
       if(i<1||i>L.length)
       {
       printf("你要删除的元素位置超出了表的界限");
       return L;
       }
       int *q = L.elem+i-1;//要删除的位置
       printf("要删除的数值是%d\n",*(q));
       int *p = L.elem+(L.length-1);//表最后一个元素的位置 
       for(q+1;q+1<=p;q++)//把要删除位置的元素依次向左移动一个位置 
       {
           *q = *(q+1);               
       } 
       --L.length;
       return L;
}

SqList ListCombine_Sq(SqList L1,SqList L2){
       int length = L2.length;
       int *q = L1.elem+L1.length;//L1最后一个元素的下一个位置
       int *p = L2.elem;
       for(q;L2.length>0;p++) 
       {
       *q = *p;
       q++;
       L2.length--; 
       L1.length++;
       if(L1.length >= L1.listsize){
        int *newbase = (int *)realloc(L1.elem,(L1.listsize+LISTINCREMENT)*sizeof(int));
        if(!newbase)exit(1);
        L1.elem = newbase;
        L1.listsize = L1.listsize+LISTINCREMENT;
        printf("内存不足,需要扩充"); 
        } 
       }
       return L1;
}

void printList(SqList L){
     printf("-----------------------------\n");
     int i;
     int array[L.length];
     for(i = 0;i<(L.length);i++){
           array[i] = *(L.elem+i);
           printf("L[%d]=%d\n",i,array[i]);       
     }
     printf("-----------------------------\n");
}

int main(void){
    SqList L1;
    SqList L2;
    L1 = InitList_Sq(L1);
    L2 = InitList_Sq(L2);
    printf("%d\n",L1.length);
    L1 = ListInsert_Sq(L1,5,1);
    L1 = ListInsert_Sq(L1,1,1);
    L1 = ListInsert_Sq(L1,1,1);
    L1 = ListInsert_Sq(L1,1,2); 
    L1 = ListInsert_Sq(L1,1,3);
    L1 = ListInsert_Sq(L1,1,4);
    printf("%d\n",L1.length);
    printList(L1);
    L2 = ListInsert_Sq(L2,5,1);
    L2 = ListInsert_Sq(L2,1,1);
    L2 = ListInsert_Sq(L2,1,1);
    L2 = ListInsert_Sq(L2,1,2); 
    L2 = ListInsert_Sq(L2,1,3);
    L2 = ListInsert_Sq(L2,1,4);
    printf("%d\n",L2.length);
    printList(L2);
    L1 = ListCombine_Sq(L1,L2);
    printList(L1);
    printf("合并之后的L2的长度是%d\n",L2.length);
    system("PAUSE");
    return 0;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值