数据结构——顺序表合并(C语言实现)

本文介绍了一个简单的算法,用于合并两个已排序的顺序表A和B为一个新的已排序顺序表C。该算法首先定义了顺序表的数据结构,并通过扫描两个表中的最小元素依次构建新的顺序表C,直至所有元素都被正确合并。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好久没来写博客了,最近开学社团的事情比较忙,然后之后的博客可能写数据结构和算法方面的比较多。
————————————————假装自己是分割线——————————————————
这里是将有序(从小到大)顺序表A,B 合并为一个有序(由小到大)顺序表C

#define MAXSIZE 100
#include<stdio.h>

// 定义数据结构,size为顺序表实际元素个数
typedef struct {
    int m[MAXSIZE];
    int size;
}list;

//创建
void creat(list *s)
{
    int n, len;
    printf("输入顺序表的长度:");
    scanf("%d", &len);
    s->size = len;
    printf("输入顺序表的元素:");
    for (int i = 0; i < len; i++)
    {
        scanf("%d", &n);
        s->m[i] = n;
    }
}

//输出
void print(list *s)
{
    for (int i = 0; i < s->size; i++)
        printf("%d ", s->m[i]);
    printf("\n");
}

//合并
void combine(list *a, list *b, list *c)  
{
    int i=0, j=0, k=0; 
    //同时扫描两个表 
    while(i<a->size && j<b->size) 
    {
        if(a->m[i]<=b->m[j]) 
        {
            c->m[k] = a->m[i]; 
            i++;         
            k++;         
        }
        else
        {
            c->m[k] = b->m[j];
            j++;            
            k++;         
        }
    }
    //A表扫完,B组未扫完 
    if(i==a->size)         
    {
        for(; j<b->size; j++)
        {
            c->m[k] = b->m[j];
            k++; 
        }        
    }
    if(j==b->size)              
    {
        for(; i<a->size; i++)
        {
            c->m[k] = a->m[i];
            k++; 
        }    
    }
    c->size=k;
}


int main()
{
    list a;
    list b;
    list c;
    creat(&a);
    creat(&b);
    print(&a);
    print(&b);
    combine(&a,&b,&c);
    print(&c);
}
### C语言实现顺序表数据结构 #### 动态顺序表实现 动态顺序表是一种通过指针管理内存空间的方式实现的线性数据结构。它允许在运行时根据需求分配和释放内存资源,从而提高程序灵活性。 以下是基于王道考研资料中的动态顺序表实现方法: ```c #include <stdio.h> #include <stdlib.h> #define INIT_SIZE 10 // 初始容量大小 typedef int ElemType; // 定义元素类型为整型 // 定义顺序表结构体 typedef struct { ElemType* data; // 存储数据的动态数组 int length; // 当前长度 int capacity; // 总容量 } SeqList; // 初始化顺序表 void InitSeqList(SeqList* L) { L->data = (ElemType*)malloc(INIT_SIZE * sizeof(ElemType)); // 动态分配初始内存 L->length = 0; L->capacity = INIT_SIZE; } // 插入元素到指定位置 int Insert(SeqList* L, int pos, ElemType value) { if (pos < 0 || pos > L->length) { // 检查插入位置合法性 printf("Insert position error!\n"); return -1; } if (L->length >= L->capacity) { // 如果当前容量不足,则扩容 L->capacity *= 2; L->data = (ElemType*)realloc(L->data, L->capacity * sizeof(ElemType)); } for (int i = L->length; i > pos; --i) { // 将后续元素向后移动一位 L->data[i] = L->data[i - 1]; } L->data[pos] = value; // 插入新元素 ++L->length; return 0; } // 删除指定位置的元素 int Delete(SeqList* L, int pos) { if (pos < 0 || pos >= L->length) { // 检查删除位置合法性 printf("Delete position error!\n"); return -1; } for (int i = pos; i < L->length - 1; ++i) { // 将后续元素向前移动一位 L->data[i] = L->data[i + 1]; } --L->length; return 0; } ``` 上述代码实现了动态顺序表的核心功能,包括初始化、插入以及删除操作[^1]。 --- #### 静态顺序表实现 静态顺序表则是利用固定大小的数组来存储数据的一种方式。它的优点在于简单易懂,缺点是无法灵活调整存储空间。 下面是静态顺序表的一个典型实现示例: ```c #include <stdio.h> #define MAXSIZE 10 // 定义最大长度 typedef struct { int data[MAXSIZE]; // 使用静态数组存储数据 int length; // 表当前的长度 } Sqlist; // 初始化顺序表 void InitList(Sqlist* L) { L->length = 0; // 设置初始长度为0 for (int i = 0; i < MAXSIZE; i++) { L->data[i] = 0; // 清除数组内容(可选) } } // 插入元素到指定位置 int ListInsert(Sqlist* L, int pos, int value) { if (pos < 1 || pos > L->length + 1 || L->length >= MAXSIZE) { // 检查插入条件 return -1; } for (int i = L->length; i >= pos; --i) { // 向后移动元素 L->data[i] = L->data[i - 1]; } L->data[pos - 1] = value; // 插入新元素 L->length++; return 0; } // 删除指定位置的元素 int ListDelete(Sqlist* L, int pos) { if (pos < 1 || pos > L->length) { // 检查删除条件 return -1; } for (int i = pos; i < L->length; ++i) { // 向前移动元素 L->data[i - 1] = L->data[i]; } L->length--; return 0; } ``` 此代码展示了如何使用固定的数组构建顺序表并完成基本的操作函数[^3]。 --- #### 关键注意事项 需要注意的是,在C语言中不存在`bool`类型的原生支持,因此如果需要布尔逻辑判断,可以采用宏定义或其他替代方案[^2]。 例如: ```c #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif ``` 这种技巧可以帮助开发者模拟布尔变量的功能。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值