c语言线性表的合并
A. 创建并合并两个线性表 c语言
其中一个程序调用镇毕另一个程序的方式,使用系统调用system可以。
如果两个程序要交换使用数据,可以用建立文件作为数据交换的“通道”。
如果你不知道这李改两个程序的代码,那么就新建一个可以哪旅判调用这两个已知程序的程序吧
B. 将两个有序线性表合并成一个有序线性表,用C语言 在线急等!!!!
代码写好了。
经测试VC下通过。
#include <stdio.h>
int merge(int *a,int n1,int *b,int n2,int *s)
{
int i=0,j=0,k=0;
while(i<n1&&j<n2)
{
if(a[i]>b[j]){
if(k&&s[k-1]==b[j])//有重复元素
j++;
else
s[k++]=b[j++];
}
else{
if(k&&s[k-1]==a[i])//有重复元素
i++;
else
s[k++]=a[i++];
}
}
while(i<n1){
if(k&&s[k-1]==a[i])
i++;
else
s[k++]=a[i++];
}
while(j<n2){
if(k&&s[k-1]==b[j])//有重复元素
j++;
else
s[k++]=b[j++];
}
return k;
}
int main()
{
int a[100],b[100],s[200],n1,n2,i,n3;
printf("输入第一个数组元素个数:");
scanf("%d",&n1);
printf("输入%d个升厅弊序元素(空格隔开):",n1);
for(i=0;i<n1;i++)
scanf("%d",&a[i]);
printf("输入第二个数组元素个数:");
scanf("%d",&n2);
printf("输入%d个升序元素(空格隔开)数伏弊:",n2);
for(i=0;i<n2;i++)
scanf("%d",&b[i]);
n3=merge(a,n1,b,n2,s); //a和b数组的元素合并到s数组里去(并消除重复元素),并返回合并后数组的元素个数
printf("合并后元素数组为:");
for(i=0;i<n3;i++)
printf("%d "薯族,s[i]);
printf("\n");
return 0;
}
附测试数据一组:
5
3 50 50 100 100
3
8 50 80
输出为:3 8 50 80 100
C. 求大神帮忙用C语言写一个程序。 要求:定义两个线性表(内容由用户输入),合并这两个线性表,并按顺序
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#include <stdbool.h>
typedef struct{
int *data;
int length; // 线性表的长度
int top; // 线性表的当前元素个数
}List;
// 初始化线性表
void list_init(List *li,int length){
li->length = length;
li->top = 0;
li->data = (int*) malloc(li->length * sizeof(int));
}
// 向线性表插入元素余颤
bool add_list(List* li, int data){
if(li->top >= li->竖哗败length){
return false;
}
li->data[li->top++] = data;
return false;
}
// 将两个线性表合并并对元素芦咐进行排序
void merge_list(List *dest, List *li1, List *li2){
list_init(dest, li1->top+li2->top+1);
// 把线性表li1,li2的所有元素添加到线性表dest中
int i = 0;
while(i < li1->top){
add_list(dest, li1->data[i]);
i++;
}
i = 0;
while(i < li2->top){
add_list(dest, li2->data[i]);
i++;
}
// 把线性表dest元素进行排序(由大到小)
for(i=0; i<dest->top; i++){
int j;
for(j=i; j<dest->top; j++){
if(dest->data[i] < dest->data[j]){
int t = dest->data[i];
dest->data[i] = dest->data[j];
dest->data[j] = t;
}
}
}
}
// 显示线性表
void show_list(List *li){
int i;
for(i=0; i<li->top; i++){
printf("%3d",li->data[i]);
if((i+1)%10 == 0){
printf("\n");
}
}
printf("\n");
}
int main(void)
{
int arr1[7]={11,4,7,2,9,15,10};
int arr2[5]={2,1,5,1,19};
List li1;
list_init(&li1, 50);
int i;
for(i=0; i<7; i++){
add_list(&li1,arr1[i]);
}
show_list(&li1);
List li2;
list_init(&li2, 50);
for(i=0; i<5; i++){
add_list(&li2,arr2[i]);
}
show_list(&li2);
List dest;
merge_list(&dest, &li1, &li2);
show_list(&dest);
return 0;
}
D. c语言有序线性表合并数据
由于结果保存的表类型不同,
算法也有差别,
我选择结果保存为动态数组的算法,
其它算法可以自己搞.
1,
计算含派La的元素个数赋值给氏老绝numOfLa;
计算Lb的元素个数赋值给numOfLb;
2,
分配能够容纳numOfLa+numOfLb个元素的内存空间,
首地址指针为pRes;
3,
设置变量counterLa并赋初值0,
设置变量counterLb并赋初值0,
设置变量counterRes并赋初值0
4,
当counterLa
<
numOfLa
并且
counterLb
<
numOfLb时做以下步:
4.1
如果La[counterLa]
等于Lb[counterLb]时,
pRes[couterRes]赋值为La[couterLa],
couterLa和counterLb
和counterRes三者均加一,
否则
4.2
如果La[counterLa]
小于Lb[counterLb]时,
pRes[couterRes]赋值为La[couterLa],
counterLa和couterRes两者均加一,
否则
4.3
pRes[couterRes]赋值为Lb[couterLb],
counterLb和couterRes两者均加一
5,
如果counterLa等于numOfLa,
则从i
=
couterLb
至i
<
numOfLb做以下:
5.1
pRes[counterRes]
赋值为
Lb[i]
5.2
counterRes和i两者增一;
6,
否则,
从i
=
couterLa
至i
<
numOfLa做以下:
6.1
pRes[counterRes]
赋值为
La[i]
6.2
counterRes和歼姿i两者增一;
7结束,
pRes中保存合并的线性表数据,
数据个数为counterRes;
在此基础上,
也可以写出链表的算法
E. 求C语言程序代码,合并线性表
#include<stdio.h>
#include<stdlib.h>
#defineMAXSIZE110
typedefstruct
{
intelem[MAXSIZE];
intlen;
}sqlist;
voidmerge(sqlist*la,sqlist*lb,sqlist*lc)
{
inti,j,k;
i=j=k=0;
if(la->len+lb->len<=MAXSIZE)
{
while(i<la->len&&j<lb->len)
{
if(la->elem[i]<lb->elem[j])
{
lc->elem[k]=la->elem[i];
i++;
k++;
}
else
{
lc->elem[k]=lb->elem[j];
j++;
k++;
}
}
while(i<la->len)
{
lc->elem[k]=la->elem[i];
i++;
k++;
}
while(j<lb->len)
{
lc->elem[k]=lb->elem[j];
j++;
k++;
}
lc->len=la->len+lb->len;
}
elseprintf("outofbound");
}
voidprint(sqlist*l)
{
闷或租inti;
for(i=0;i<l->len;i++)
{
printf("团坦%d",l->elem[i]);
蚂兆}
printf(" ");
}
intmain(void)
{
inti;
sqlistla;
sqlistlb;
sqlistlc;
printf("输入线性表LA的元素个数:");
scanf("%d",&la.len);
printf("输入线性表LA的%d个元素:",la.len);
for(i=0;i<la.len;i++)
scanf("%d",&la.elem[i]);
printf("输入线性表LB的元素个数:");
scanf("%d",&lb.len);
printf("输入线性表LB的%d个元素:",lb.len);
for(i=0;i<lb.len;i++)
scanf("%d",&lb.elem[i]);
merge(&la,&lb,&lc);
print(&lc);
system("pause");
return(0);
}
F. 数据结构C语言版,顺序线性表的合并程序。最好有注释
//希望我的回答对你的学习有帮助
#include<stdlib.h>
/*顺序表存储空间长度的最小值*/
#defineLISTMINSIZE10
/*顺序表存储结构类型定义*/
typedefstruct
{
ListDT*base;/*顺序表空间基地址*/
intlistsize;/*顺序表空间尺寸*/
intlen;/*顺序表长度*/
}SeqList;
/*顺序表初始化*/
voidListInitialize(SeqList*pL,intsize)
{
if(size<LISTMINSIZE)
size=LISTMINSIZE;/*限定不能小于最小尺寸*/
pL->listsize=size;
pL->base=(ListDT*)malloc(pL->listsize*sizeof(ListDT));
if(!pL->base)
纤亏exit(EXIT_FAILURE);
pL->len=0;/*初始化空表*/
}
/*按给定的下标取顺序表元素值*/
BOOLListElem(SeqListL,intindex,ListDT*pelem)
{
BOOLflg=TRUE;
if(index<0||index>L.len-1)
flg=FALSE;/*参数越界*/
else
*pelem=L.base[index];
returnflg;
}
/*求顺序表长度*/
intListLen(SeqListL)
{
returnL.len;
}
/*在顺序表中指定序号位置插入元素*/
BOOLListInsert(SeqList*pL,intpos,ListDTd)
{
BOOLflg=TRUE;
inti;
if(pos<0||pL->len>=pL->listsize||pos>pL->len)
flg=FALSE;
else
{
for(i=pL->len-1;i>=pos;i--)/*移动数据*/
pL->base[i+1]=pL->base[i];
pL->base[pos]=d;/*写入数据*/
pL->len++;/*表长增1*/
}
returnflg;
}
/*把顺序表中指定序号的元素删除*/
BOOLListDel(SeqList*pL,intpos)
{
BOOLflg=TRUE;
inti;
if(pos<0||pos>=pL->len)
flg=FALSE;
else
含悔{
for(i=pos+1;i<pL->len;i++)/*移动数据*/
pL->base[i-1]=pL->base[i];
pL->len--;/*表长增1*/
谈竖正}
returnflg;
}
/*在顺序表中查找元素*/
intListLoc(SeqListL,ListDTd,BOOL(*equal)(ListDT,ListDT))
{
intpos=L.len-1;
while(pos>=0&&!(*equal)(L.base[pos],d))
pos--;
returnpos;
}
/*取前导元素序号位置*/
BOOLListPrior(SeqListL,intpos,int*ppriorpos)
{
BOOLflg=TRUE;
if(pos>0&&pos<L.len)
*ppriorpos=pos-1;
else
flg=FALSE;
returnflg;
}
/*取后继元素序号位置*/
BOOLListNext(SeqListL,intpos,int*pnextpos)
{
BOOLflg=TRUE;
if(pos>=0&&pos<L.len-1)
*pnextpos=pos+1;
else
flg=FALSE;
returnflg;
}
/*销毁顺序表*/
voidListDestroy(SeqListL)
{
free(L.base);
}
#endif
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
建议性测试用程序
*/
typedefenum{TRUE=1,FALSE=0}BOOL;
typedefintListDT;
#include"seqlist.c"
voidprintSeqList(SeqListL)
{
inti;
ListDTx;
printf(" List: ");
for(i=0;i<ListLen(L);i++)
{
ListElem(L,i,&x);
printf("%3d",x);
}
}
BOOLdataequal(intx,inty)
{
return(x==y)?TRUE:FALSE;
}
#defineN5
voidmain()
{
inti,prior,next;
ListDTx,test[N]={10,20,30,40,50};
SeqListL;
/*初始化顺序表*/
ListInitialize(&L,N);
/*在表头插入N个元素*/
for(i=0;i<N;i++)
ListInsert(&L,0,test[i]);
printSeqList(L);
/*删除元素*/
ListDel(&L,N/2);
printSeqList(L);
printf(" inputakey: ");
scanf("%d",&x);
/*查找x在表中位置*/
i=ListLoc(L,x,dataequal);
/*求x的前导元素*/
if(ListPrior(L,i,&prior))
{
ListElem(L,prior,&x);
printf("Prior:%d ",x);
}
else
printf("noPrior. ");
/*求x的后继*/
if(ListNext(L,i,&next))
{
ListElem(L,next,&x);
printf("Next:%d ",x);
}
else
printf("noNext. ");
/*求表长*/
printf("Listlength=%d",ListLen(L));
/*销毁顺序表*/
ListDestroy(L);
}