① 數據結構(c語言版):順序存儲結構上編程實現將兩個有序表合成一個有序表,要完整程序,包括MAIN函數。
#include<stdio.h>
void merger(int d1[10],int t1,int d2[10],int t2,int result[20])
{ int k1=0,k2=0,k=0;
while(k1<t1 && k2<t2)
{ if(d1[k1]<d2[k2])
result[k++]=d1[k1++];
else
result[k++]=d2[k2++];
}
if(k1<t1)
for(k2=k1;k2<t1;k2++)
result[k++]=d1[k2];
else
for(k1=k2;k1<t2;k1++)
result[k++]=d2[k1];
}
int main()
{ int data1[10]={3,5,7,9,12,19,25,26,27},data2[10]={1,4,6,8,9,15,17,21},r[20];
int total1=6,total2=8,k;
merger(data1,total1,data2,total2,r);
for(k=0; k<total1+total2;k++)
printf("%d. %d\n",k+1,r[k]);
printf("\ntotal1=%d total2=%d",total1,total2) ;
system("pause");
}
② 請用演算法寫出兩個有序表合並成一個有序線性表(用C語言
#include "stdio.h" main() { int a,b,c,i,j,k,low,high,mid; int la[50]; int lb[50]; int lc[50]; printf("Please input the width of la,lb,lc:\n"); printf("Input here:"); scanf("%d,%d,%d",&a,&b,&c); printf("a=%d,b=%d,c=%d\n",a,b,c); if (a+b>c) printf("lc overflow,operation halt!\n"); else { printf("Input la:"); for(i=1;i<=a;++i) { scanf("%d",&la[i]); la[0]=la[i]; low=1; high=i; while(low<=high) { mid=(low+high)/2; if(la[0]=low;j--) la[j+1]=la[j]; la[low]=la[0]; } printf("\n"); printf("Input lb:"); for(i=1;i<=b;++i) { scanf("%d",&lb[i]); lb[0]=lb[i]; low=1; high=i; while(low<=high) { mid=(low+high)/2; if(lb[0]=low;j--) lb[j+1]=lb[j]; lb[low]=lb[0]; } printf("\n"); printf("la is:"); for (i=1;i<=a;i++) printf("%d ",la[i]); printf("\n"); printf("lb is:"); for (j=1;j<=b;j++) printf("%d ",lb[j]); i=1;j=1;k=0; while (i<=a && j<=b) if (la[i]>lb[j]) { lc[k]=lb[j];k++;j++;} else { lc[k]=la[i];k++;i++;} while (i<=a) {lc[k]=la[i];k++;i++;} while (j<=b) {lc[k]=lb[j];k++;j++;} printf("\n"); printf("lc is:"); for (i=0;i } getch(); } 把la,lb,lc分別換一下就OK了
希望採納
③ 如何用c語言編合並兩個順序線性表的程序
1、一開始的思路:把A、B都丟進C里,然後對C排序。人們一開始想到的總是最懶的辦法,往往是最沒效率的。
改進:由於A、B是排好序的,先把A丟進C里,再拿B元素一個個往裡查找插入。這么做要頻繁移動元素,如果線性表不是鏈表的話,開銷很大。
再改進:從A、B中各拿一個元素出來,比較後把小的放進C里,再從剛才拿出元素的那個表裡再拿個元素出來,再比較,把小的放進C里,重復這樣的操作,直到A、B其中一個中的元素拿完為止,再把還有剩的元素全丟進C里。
2、常式:
#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);
}