本文目錄一覽:
數據結構C語言版,順序線性表的合併程序。最好有注釋
//希望我的回答對你的學習有幫助
#include stdlib.h
/*順序表存儲空間長度的最小值*/
#define LISTMINSIZE 10
/*順序表存儲結構類型定義*/
typedef struct
{
ListDT*base; /*順序表空間基地址*/
intlistsize; /*順序表空間尺寸*/
intlen; /*順序表長度*/
}SeqList;
/*順序表初始化*/
void ListInitialize(SeqList *pL, int size)
{
if(sizeLISTMINSIZE)
size=LISTMINSIZE; /*限定不能小於最小尺寸*/
pL-listsize=size;
pL-base=(ListDT*)malloc(pL-listsize*sizeof(ListDT));
if(!pL-base)
exit(EXIT_FAILURE);
pL-len=0; /*初始化空表*/
}
/*按給定的下標取順序表元素值*/
BOOL ListElem(SeqList L, int index, ListDT *pelem)
{
BOOLflg=TRUE;
if(index0|| indexL.len-1 )
flg=FALSE; /*參數越界*/
else
*pelem=L.base[index];
returnflg;
}
/*求順序表長度*/
int ListLen(SeqList L)
{
returnL.len;
}
/*在順序表中指定序號位置插入元素*/
BOOL ListInsert(SeqList *pL, int pos, ListDT d)
{
BOOLflg=TRUE;
inti;
if(pos0|| pL-len=pL-listsize || pospL-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;
}
/*把順序表中指定序號的元素刪除*/
BOOL ListDel(SeqList *pL, int pos)
{
BOOLflg=TRUE;
inti;
if(pos0|| pos=pL-len)
flg=FALSE;
else
{
for(i=pos+1;ipL-len; i++) /*移動數據*/
pL-base[i-1]=pL-base[i];
pL-len–; /*表長增1*/
}
returnflg;
}
/*在順序表中查找元素*/
int ListLoc(SeqList L, ListDT d,BOOL (*equal)(ListDT,ListDT))
{
intpos=L.len-1;
while(pos=0 !(*equal)(L.base[pos],d))
pos–;
returnpos;
}
/*取前導元素序號位置*/
BOOL ListPrior(SeqList L, int pos, int *ppriorpos)
{
BOOLflg=TRUE;
if(pos0 posL.len)
*ppriorpos=pos-1;
else
flg=FALSE;
returnflg;
}
/*取後繼元素序號位置*/
BOOL ListNext(SeqList L, int pos, int *pnextpos)
{
BOOLflg=TRUE;
if(pos=0 posL.len-1)
*pnextpos=pos+1;
else
flg=FALSE;
returnflg;
}
/*銷毀順序表*/
void ListDestroy(SeqList L)
{
free(L.base);
}
#endif
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
建議性測試用程序
*/
typedef enum {TRUE=1,FALSE=0} BOOL;
typedef int ListDT;
#include “seqlist.c”
void printSeqList(SeqList L)
{
inti;
ListDTx;
printf(“\nList:\n”);
for(i=0;iListLen(L); i++)
{
ListElem(L,i,x);
printf(“%3d”,x);
}
}
BOOL dataequal(int x, int y)
{
return(x==y)? TRUE:FALSE;
}
#define N 5
void main()
{
inti,prior,next;
ListDTx,test[N]={10,20,30,40,50};
SeqListL;
/*初始化順序表*/
ListInitialize(L,N);
/*在表頭插入N個元素*/
for(i=0;iN; i++)
ListInsert(L,0,test[i]);
printSeqList(L);
/*刪除元素*/
ListDel(L,N/2);
printSeqList(L);
printf(“\ninputa key:\n”);
scanf(“%d”,x);
/*查找x在表中位置*/
i=ListLoc(L,x,dataequal);
/*求x的前導元素*/
if(ListPrior(L,i,prior))
{
ListElem(L,prior,x);
printf(“Prior:%d\n”,x);
}
else
printf(“noPrior.\n”);
/*求x的後繼*/
if(ListNext(L,i,next))
{
ListElem(L,next,x);
printf(“Next:%d\n”,x);
}
else
printf(“noNext.\n”);
/*求表長*/
printf(“Listlength=%d”,ListLen(L));
/*銷毀順序表*/
ListDestroy(L);
}
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;
在此基礎上,
也可以寫出鏈表的算法
如何用C語言把兩個有序線性列表合併成一個有序線性鏈表(不超過10行的程序)
#includestdio.h
#include malloc.h
#includelimits.h
#define MAX 1024
void merge(int a[],int p,int q,int b[],int r,int s,int c[])
{int i,j,n1,n2,n,k,m;
n1=q-p+1;
n2=s-r+1;
int *l=(int *)malloc(sizeof(int)*(n1+1));
for(i=0;in1;i++)
l[i]=a[p+i-1];
int *t=(int *)malloc(sizeof(int)*(n2+1)); for(j=0;jn2;j++)
t[j]=b[r+j-1];
l[n1]=INT_MAX;t[n2]=INT_MAX;
i=0;
j=0;
for(k=0;kn1+n2;k++)
{if(l[i]t[j]){c[k]=l[i];
i++;}
else {c[k]=t[j];
j++;}}
for(i=0;in1+n2;i++)
printf(“%d “,c[i]);
printf(“\n”);
}
int main()
{
int i;
int arr[] = {4,5,9,1000,1001};
int arr2[] = {1,7,8,999,1003,1005};
int *res = (int*)malloc(sizeof(int) * 100);
merge(arr,1,5,arr2,1,6,res);
return 0;
}
求C語言程序代碼,合併線性表
#includestdio.h
#includestdlib.h
#define MAXSIZE 110
typedef struct
{
int elem[MAXSIZE];
int len;
}sqlist;
void merge(sqlist *la,sqlist *lb,sqlist *lc)
{
int i,j,k;
i=j=k=0;
if(la-len+lb-len=MAXSIZE)
{
while(ila-lenjlb-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(ila-len)
{
lc-elem[k]=la-elem[i];
i++;
k++;
}
while(jlb-len)
{
lc-elem[k]=lb-elem[j];
j++;
k++;
}
lc-len=la-len+lb-len;
}
else printf(“out of bound”);
}
void print(sqlist *l)
{
int i;
for(i=0;il-len;i++)
{
printf(“%d “,l-elem[i]);
}
printf(“\n”);
}
int main(void)
{
int i;
sqlist la;
sqlist lb;
sqlist lc;
printf(“輸入線性表LA的元素個數:”);
scanf(“%d”,la.len);
printf(“輸入線性表LA的%d個元素:”,la.len);
for(i=0;ila.len;i++)
scanf(“%d”,la.elem[i]);
printf(“輸入線性表LB的元素個數:”);
scanf(“%d”,lb.len);
printf(“輸入線性表LB的%d個元素:”,lb.len);
for(i=0;ilb.len;i++)
scanf(“%d”,lb.elem[i]);
merge(la,lb,lc);
print(lc);
system(“pause”);
return(0);
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/206838.html