#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct
{
ElemType *elem;
int length;
int listsize;
} SqList;
Status InitList(SqList *L)
{
L->elem=(ElemType *)malloc(sizeof(ElemType)*LIST_INIT_SIZE);
if(!L->elem) exit(OVERFLOW);
L->length=0;
L->listsize=LIST_INIT_SIZE;
return OK;
}
Status DestroyList(SqList *L)
{
if(!L->elem) return ERROR;
L->elem=NULL;
return OK;
}
Status ListEmpty(SqList L)
{
if(!L.length) return TRUE;
else return FALSE;
}
Status ListLength(SqList L)
{
return L.length;
}
Status ClearList(SqList *L)
{
if(!ListEmpty(*L))
L->length=0;
return OK;
}
Status GetElem(SqList L, int i, ElemType *e)
{
if(i<1 || i>L.length) return ERROR;
*e=L.elem[i-1];
return OK;
}
Status equal(ElemType a, ElemType b)
{
if(a==b) return TRUE;
else return FALSE;
}
Status LocateElem(SqList L, ElemType e, Status (*compare)(ElemType, ElemType))
{
int i=1;
while(i<=L.length && !compare(L.elem[i-1], e)) i++;
if(i<=L.length) return i;
else return ERROR;
}
Status PriorElem(SqList L, ElemType cur_e, ElemType *pre_e)
{
int i=LocateElem(L, cur_e, equal);
if(i>1)
{
GetElem(L, i-1, pre_e);
return OK;
}
return ERROR;
}
Status NextElem(SqList L, ElemType cur_e, ElemType *next_e)
{
int i=LocateElem(L, cur_e, equal);
if(i && i<L.length)
{
GetElem(L, i+1, next_e);
return OK;
}
return ERROR;
}
Status ListInsert(SqList *L, int i, ElemType e)
{
if(i<1 || i>(L->length+1)) return ERROR;
if(L->length==L->listsize)
{
ElemType *newbase;
newbase=(ElemType *)realloc(L->elem, (L->listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW);
L->elem=newbase;
L->listsize+=LISTINCREMENT;
}
ElemType *p, *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;
}
Status ListDelete(SqList *L, int i, ElemType *e)
{
if(i<1 || i>(L->length+1)) return ERROR;
ElemType *p, *q;
p=&L->elem[i-1];
*e=*p;
q=&L->elem[L->length-1];
for(++p; p<=q; p++) *(p-1)=*p;
(L->length)--;
return OK;
}
void Union(SqList *La, SqList Lb)
{
ElemType e;
int i;
int La_len=ListLength(*La);
int Lb_len=ListLength(Lb);
for(i=1; i<=Lb_len; i++)
{
GetElem(Lb, i, &e);
if(!LocateElem(*La, e, equal))
ListInsert(La, ++La_len, e);
}
}
void MergeList(SqList La, SqList Lb, SqList *Lc)
{
InitList(Lc);
int i=1, j=1;
int k=0;
ElemType ai, bj;
int La_len=ListLength(La);
int Lb_len=ListLength(Lb);
while((i<=La_len)&&(j<=Lb_len))
{
GetElem(La, i, &ai);
GetElem(Lb, j, &bj);
if(ai<=bj)
{
ListInsert(Lc, ++k, ai);
i++;
}
else
{
ListInsert(Lc, ++k, bj);
j++;
}
}
while(i<=La_len)
{
GetElem(La, i++, &ai);
ListInsert(Lc, ++k, ai);
}
while(j<=Lb_len)
{
GetElem(Lb, j++, &bj);
ListInsert(Lc, ++k, bj);
}
}
/**********O(La.length+Lb.length)**********/
void MergeList_Sq(SqList La, SqList Lb, SqList *Lc)
{
ElemType *pa=La.elem;
ElemType *pb=Lb.elem;
Lc->listsize=Lc->length=La.length+Lb.length;
ElemType *pc=Lc->elem=(ElemType *)malloc(sizeof(ElemType)*Lc->listsize);
if(!Lc->elem) exit(OVERFLOW);
int *pa_last=La.elem+La.length-1;
int *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) *pc++=*pa++;
while(pb<=pb_last) *pc++=*pb++;
}
void PrintList(SqList L)
{
int i;
for(i=1; i<=L.length; i++)
printf("%d ", L.elem[i-1]);
printf("\n");
}
void CreateList(SqList *L)
{
InitList(L);
int Num, i;
ElemType e;
scanf("%d", &Num);
for(i=1; i<=Num; i++)
{
scanf("%d", &e);
ListInsert(L, i, e);
}
}
int main()
{
SqList La, Lb, Lc;
CreateList(&La);
CreateList(&Lb);
MergeList_Sq(La, Lb, &Lc);
PrintList(Lc);
return 0;
}
線性表(動態(tài)數(shù)組)
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
推薦閱讀更多精彩內(nèi)容
- 對于線性結(jié)構(gòu)的順序表而言,特點: ···1.添加和刪除元素,時間復(fù)雜度是O(n),因為要移動元素.。 ···(1)...
- 在計算機內(nèi)存組織中,只有兩種存儲數(shù)據(jù)的基本形式:數(shù)組和鏈表。 (1)數(shù)組的管理: int a[100];//就是在...
- 第一步,定義順序表的結(jié)構(gòu)和相關(guān)的數(shù)組或變量,和初始化和清空列表。 第二步,判斷表是否為空和判斷表是否已滿。 第三步...
- 本文行文思路結(jié)構(gòu) 一. 線性表 線性結(jié)構(gòu)是數(shù)據(jù)結(jié)構(gòu)中三種基本結(jié)構(gòu)之一. 而線性結(jié)構(gòu)的特點是:在數(shù)據(jù)元素的非空有限集...