#ifndef __SQLLIST_H__ #define __SQLLIST_H__ #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLF -1 #define OVERFLOW -2 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef int Status; typedef int ElemType; typedef struct { ElemType *elem; ElemType length; ElemType listsize; }SqList; #endif
#include"SeqList.h" #include<stdlib.h> #include<stdio.h> 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; } Status listInsert(SqList &L, int i, ElemType e) { if(i < 1 || i > L.length + 1){ return ERROR; } if(L.length > L.listsize) { ElemType *newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType)); if(!newbase) { exit(OVERFLOW); } L.elem = newbase; L.listsize += LISTINCREMENT; } ElemType *q = &(L.elem[i - 1]); for(ElemType *p = &(L.elem[L.length - 1]); p >= q; --p) { *(p + 1) = *p; } *q = e; ++L.length; return OK; } void pShow(SqList L){ printf("======= SqList ======\n"); if(L.length != 0) { ElemType *t = L.elem; for(int i = 0; i < L.length; i++) { printf("L.elem[%d] = %d\n", i, t[i]); } } else { } printf("L.length = %d\n", L.length); printf("L.listsize = %d\n", L.listsize); } Status GetElem(SqList &L, int i, ElemType &e) { if(i > L.length || i < 1) { exit(OVERFLOW); } e = L.elem[i - 1]; return OK; } Status LocateElem_Sq(SqList L, ElemType e) { ElemType i = 1; ElemType *p = L.elem; while(i <= L.length && *p++ != e) { ++i; } if(i <= L.length) { return i; } else{ return 0; } } Status ListLength(SqList L) { return L.length; } void Union(SqList &a, SqList b) { ElemType a_len = ListLength(a); ElemType b_len = ListLength(b); ElemType e; for (int i = 1; i <= b_len; ++i) { /* code */ GetElem(b, i, e); if(!LocateElem_Sq(a, e)) { listInsert(a, ++a_len, e); } } } void MergeList(SqList la, SqList lb, SqList &Lc) { initList_Sq(Lc); ElemType i = 1; ElemType j = 1; ElemType k = 0; ElemType La_len = ListLength(la); ElemType Lb_len = ListLength(lb); ElemType ai, bj; 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); } } Status ListDelete_Sq(SqList &L, int i, ElemType &e) { if(i < 1 || (i > L.length)) { return ERROR; } ElemType *p = &(L.elem[i - 1]); e = *p; ElemType *q = L.elem + L.length - 1; for(++p; p <= q; ++p) { *(p -1) = *p; } --L.length; return OK; } int main() { ElemType e; SqList L; initList_Sq(L); for (int i = 0; i < 10; ++i) { /* code */ listInsert(L, i + 1, i); } SqList t; initList_Sq(t); for (int i = 0; i < 10; ++i) { /* code */ listInsert(t, i + 1, i + 10); } GetElem(L, 5, e); printf("l5 = %d\n", e); ElemType index = 6; ElemType value = LocateElem_Sq(L, index); printf("index = %d, value = %d\n", index, value); SqList r; MergeList(L, t, r); pShow(r); SqList a; initList_Sq(a); listInsert(a, 1, 3); listInsert(a, 2, 5); listInsert(a, 3, 8); listInsert(a, 4, 11); SqList b; initList_Sq(b); listInsert(b, 1, 2); listInsert(b, 2, 6); listInsert(b, 3, 8); listInsert(b, 4, 9); listInsert(b, 5, 11); listInsert(b, 6, 15); listInsert(b, 7, 20); SqList c; MergeList(a, b, c); pShow(c); Union(a, b); pShow(a); ListDelete_Sq(b, 6, e); pShow(b); return 0; }