【数据结构】线性表顺序存储(合并非递减表)代码实现c语言

虽然是c语言的语法,但事实是需要用c++的(&符),来表示引用与返回e值的效果

运行效果
在这里插入图片描述
下面是源代码

#include <stdio.h>
#include <malloc.h>
#include <iostream>
#define LIST_INIT_SIZE 100 //线性表存储空间的初始量分配
#define LISTINCREMENT 10 //线性表存储空间的分配量
#define OK 1
#define ERROR 0
#define OVERFLOW -1

typedef float ElemType;
typedef int Status;
typedef struct{
	ElemType *elem;//存储空间基址 
	Status length;//当前长度
	Status listsize;//当前分配的存储容量 
}SqList;

//函数原型
Status InitList_Sq(SqList &L);
 
//初始化空表
Status InitList_Sq(SqList &L){
	L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
	//判断内存是否分配失败 
	if(!L.elem)
	{
		exit(OVERFLOW);
	}
	L.length=0;//空表的长度为零 
	L.listsize=LIST_INIT_SIZE;//初始存储容量 
	return OK; 
} 
//在第i个元素之前插如一个数e 
Status ListInsert_Sq(SqList &L,Status i,ElemType e){
	ElemType *newbase,*p,*q;
	//判断i值是否合法 
	if(i<1||i>L.length)
	{
		return ERROR;
	}
	//判断存储空间是否已满 
	if(L.length>=L.listsize)
	{
		newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
		//判断是否重新分配成功 
		if(!newbase)
		{
			exit(OVERFLOW);
		}
		L.elem=newbase;
		L.listsize+=LISTINCREMENT;
	}
	//q为插入位置 
	q=&(L.elem[i-1]);
	for(p=&(L.elem[L.length-1]);p>=q;--p)
	{
		*(p+1)=*p;//插入位置及之后的元素右移
	} 
	*q=e;
	L.length++;
	return OK; 
}

//删除第i个数,并用e返回其值 
Status ListDelete_Sq(SqList &L,Status i,ElemType &e){
	ElemType *p,*q; 
	//在顺序表中删除第i个元素并用e返回结果
	if(i<1||i>L.length)//判断i值是否合法 
	{
		return ERROR;
	} 
	p = &(L.elem[i-1]);//p为删除的位置 
	e = *p;//把删除的元素的值给e 
	q = L.elem+L.length-1; //表尾元素的位置
	for(++p;p<=q;++p)
	{
		*(p-1)=*p;//被删除的元素之后左移 
	}
	L.length--;
	return OK;
} 

//查找元素,返回其位序,没找到返回0
Status LocateElem_Sq(SqList L,ElemType e){
	//在顺序表中查询第一个满足判定条件的数据元素
	//若元素存在则返回它的位序,否则则返回0
	int i=1;
	//i的初始值为第一个元素的位序
	while(i<=L.length&&L.elem[i-1]!=e)
	{
		i++;
	}
	if(i<=L.length)
	{
		return i;
	}
	else
	{ 	
		return 0;
	}
} 

//对两表进行有序合并
void MergeList_Sq(SqList La,SqList Lb,SqList &Lc){
	ElemType *pa,*pb,*pc,*pa_last,*pb_last;
	//已知表ab都是非递减序列
	//归并ab量表为c,c表也是非递减
	pa=La.elem;
	pb=Lb.elem;
	Lc.listsize=Lc.length=La.length+Lb.length;
	pc=Lc.elem=(ElemType *)malloc(Lc.listsize*sizeof(ElemType));
	if(!Lc.elem)//判断是否分配失败 
	{
		exit(OVERFLOW); 
	}
	pa_last=La.elem+La.length-1;
	pb_last=Lb.elem+Lb.length-1;
	while((pa<=pa_last)&&(pb<=pb_last))
	{
		if(*pa<=*pb)
		{
			*pc++=*pa++;
		}
		else
		{
			*pc++=*pb++;
		}
	}
	while(pa<=pa_last)//将a中剩余的元素复制到c中 
	{
		*pc++=*pa++;
	}
	while(pb<=pb_last)//将b中剩余的元素复制到c中 
	{
		*pc++=*pb++;
	} 
} 
int main(void){ 
	printf("                 |$$$线性表的顺序存储\n");
	printf("                 |本程序有以下几种功能:\n");
	printf("                 |1.创建顺序表\n");
	printf("                 |2.顺序表插入\n");
	printf("                 |3.顺序表删除\n");
	printf("                 |4.顺序表查找\n");
	printf("                 |5.合并两个非递减顺序表\n\n\n\n");
	
	SqList La,Lb,Lc;//定义3个表
	ElemType e;
	int i=0,a,b;
	
	//初始化空表
	InitList_Sq(La);
	InitList_Sq(Lb);
	InitList_Sq(Lc);
	
	//给a表和b表赋值
	printf("请输入你想在a表中输入的元素的个数:\n"); 
	scanf("%d",&a);
	La.length=a;
	for(i=0;i<a;i++)
	{
		scanf("%f",&La.elem[i]);
	}
	printf("请输入你想在b表中输入的元素的个数:\n"); 
	scanf("%d",&b);
	Lb.length=b;
	for(i=0;i<b;i++)
	{
		scanf("%f",&Lb.elem[i]);
	}
	
	//插入元素
	printf("请输入你想在a表插入的元素位置和元素:\n");
	scanf("%d%f",&i,&e); 
	ListInsert_Sq(La,i,e);
	printf("此时的a表为:");
	for(i=0;i<La.length;i++)
	{
		printf("%4.2f ",La.elem[i]);
	}
	printf("\n"); 
	
	//删除元素
	printf("请输入你想在b表删除的元素位置:\n");	 
	scanf("%d",&i); 
	ListDelete_Sq(Lb,i,e);
	for(i=0;i<Lb.length;i++)
	{
		printf("%4.2f ",Lb.elem[i]);
	}
	printf("\n");
	printf("删除的元素为%f:\n",e);
	
	//查找元素 
	printf("请输入要在a表中找到的元素:\n");
	scanf("%f",&e); 
	i=LocateElem_Sq(La,e);
	printf("元素的位置为%d\n",i);
	printf("\n");
	
	//对ab两表进行有序合并
	MergeList_Sq(La,Lb,Lc);
	printf("合成之后的c表为:\n");
	for(i=0;i<Lc.length;i++)
	{	
		printf("%4.2f ",Lc.elem[i]);	
	}
	return 0; 
}

吾王美滋滋!!!
在这里插入图片描述

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 答:#include<stdio.h> int MergeList(int list1[], int list2[], int result[], int n, int m){ int i=0, j=0, k=0; while(i<n && j<m){ if(list1[i] < list2[j]){ result[k++] = list1[i++]; } else{ result[k++] = list2[j++]; } } while(i<n){ result[k++] = list1[i++]; } while(j<m){ result[k++] = list2[j++]; } return 1; } int main(){ int list1[6] = {1, 5, 7, 9, 11, 13}; int list2[4] = {2, 4, 8, 10}; int result[10]; MergeList(list1, list2, result, 6, 4); printf("The merged list is: "); for(int i=0; i<10; i++){ printf("%d\t", result[i]); } return 0; } ### 回答2: 在C语言中,可以使用顺序结构来实现线性表合并。下面是一个示例代码: ```c #include <stdio.h> #define MAX_SIZE 100 // 定义线性表最大长度 // 定义线性表结构 typedef struct { int data[MAX_SIZE]; // 数据数组 int length; // 线性表长度 } SeqList; // 合并两个线性表 void merge(SeqList *list1, SeqList *list2, SeqList *result) { int i, j, k; i = j = k = 0; while (i < list1->length && j < list2->length) { if (list1->data[i] <= list2->data[j]) { result->data[k++] = list1->data[i++]; } else { result->data[k++] = list2->data[j++]; } } // 将剩余元素依次加入合并后的线性表 while (i < list1->length) { result->data[k++] = list1->data[i++]; } while (j < list2->length) { result->data[k++] = list2->data[j++]; } // 更新合并后的线性表长度 result->length = k; } int main() { SeqList list1 = {{1, 2, 3, 4, 5}, 5}; // 线性表1 SeqList list2 = {{3, 4, 5, 6, 7}, 5}; // 线性表2 SeqList result; // 合并后的线性表 merge(&list1, &list2, &result); // 合并线性表 printf("合并后的线性表:"); for (int i = 0; i < result.length; i++) { printf("%d ", result.data[i]); } return 0; } ``` 以上代码定义了一个`SeqList`结构体线性表,其中`data`数组存储线性表的元素,`length`线性表的长度。`merge`函数用于合并两个线性表,并将结果存储在`result`线性表中。在`main`函数中,创建了两个线性表`list1`和`list2`,并进行合并操作,结果存储在`result`中。最后,通过遍历打印合并后的线性表的元素。 ### 回答3: 下面是一个使用顺序结构实现线性表合并C语言代码: ```c #include <stdio.h> #define MAX_SIZE 100 // 合并函数 void mergeArrays(int arr1[], int size1, int arr2[], int size2, int mergedArr[]) { int i, j, k; i = j = k = 0; while (i < size1 && j < size2) { // 比较两个线性表的元素大小并按顺序合并到新的线性表 if (arr1[i] < arr2[j]) { mergedArr[k++] = arr1[i++]; } else { mergedArr[k++] = arr2[j++]; } } // 将剩余元素加入合并后的线性表 while (i < size1) { mergedArr[k++] = arr1[i++]; } while (j < size2) { mergedArr[k++] = arr2[j++]; } } int main() { int arr1[MAX_SIZE] = {1, 3, 5, 7, 9}; int arr2[MAX_SIZE] = {2, 4, 6, 8, 10}; int size1 = 5; int size2 = 5; int mergedArr[MAX_SIZE]; mergeArrays(arr1, size1, arr2, size2, mergedArr); printf("合并后的线性表:"); for (int i = 0; i < size1 + size2; i++) { printf("%d ", mergedArr[i]); } return 0; } ``` 该代码中定义了一个`mergeArrays`函数,其中`arr1`和`arr2`分别示两个待合并线性表,`size1`和`size2`示它们的长度,`mergedArr`合并后的线性表。在`mergeArrays`函数中,使用三个指针变量`i`、`j`和`k`分别示遍历`arr1`、`arr2`和`mergedArr`的位置。在合并过程中,通过比较`arr1`和`arr2`中当前位置的元素大小,并将较小的元素放入`mergedArr`中,然后移动相应的指针。最后,将剩余的元素加入到合并后的线性表中。 在`main`函数中,定义了两个待合并线性表`arr1`和`arr2`,并分别定义了它们的长度`size1`和`size2`,以及一个用于存储合并结果的线性表`mergedArr`。通过调用`mergeArrays`函数实现两个线性表合并,并输出合并后的结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纳萨斯瓦德

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值