1. 程式人生 > >資料結構——順序表操作(C語言實現)

資料結構——順序表操作(C語言實現)

//順序表list
#include"stdio.h"
#define maxsize 15 

typedef struct{
    int a[maxsize];   
    int size;
}list;

//建立

void create(list *s)
{
    int n,len,i=0;
    printf("請輸入順序表長度:");
    scanf("%d",&len);
    s->size=len; 
    printf("請輸入順序表元素:");
    while(i<len)
    {
        scanf("%d",&n);
        s->a[i]=n;
        i++; 
    }
} 

//初始化
void init(list *s) { s->size=0; } //尾插 void insert_end(list *s, int elem) { s->size=s->size+1; s->a[s->size-1]=elem; } //遍歷 void travel(list *s) { int i; for(i=0;i<s->size;i++) printf("%d ",s->a[i]); printf("\n"); } //判空 int is_empty(list *s) { if
(s->size==0) printf("該順序表為空\n"); else printf("該順序表不為空\n"); } //查詢值為x的位置 (輸出為第m個元素) void search(list *s, int elem) { int i; for(i=0;i<s->size;i++) { if(s->a[i]==elem) { printf("%d\n",i+1); break; } } if
(i==s->size) printf("表中無此元素"); } //指定插入 void insert(list *s,int pos,int elem) { int i; for(i=s->size;i>pos;i--) s->a[i]=s->a[i-1]; s->a[pos-1]=elem; s->size++; } //指定位置刪除 void del(list *s,int pos) { int i; for(i=pos-1;i<s->size;i++) s->a[i]=s->a[i+1]; s->size--; } //按照比a[0]小的和比它大的排序(從a[0]插入) void sort(list *s) { int i, t, k; i = s->a[0]; for (int j = 1; j < s->size; j++) { if (i > s->a[j]) { t = s->a[j]; for (k = j; k > 0; k--) s->a[k] = s->a[k - 1]; s->a[0] = t; } } } //有序合併兩個有序表 ////第一種方法,將A表元素插入到B表 void combine_1(list *sa, list *sb) { int i, j, p; for (i = 0; i < sa->size; i++) { //如果小於b表的a[0],插入第一個位置 if (sa->a[i] < sb->a[0]) { for (p = sb->size; p > 0; p--) sb->a[p] = sb->a[p - 1]; sb->a[0] = sa->a[i]; sb->size++; } //和其他的元素比較 else { for (j = 0; j < sb->size; j++) { if (sa->a[i] > sb->a[j] && sa->a[i] <= sb->a[j + 1]) { //插入到m[j+1]處 int k; for (k = sb->size; k > j + 1; k--) sb->a[k] = sb->a[k - 1]; sb->a[j + 1] = sa->a[i]; sb->size++; } } } } } ////第二種方法,A表,B表元素比較後放入C表 void combine_2(list *sa, list *sb, list *sc) { int i=0, j=0, k=0; //同時掃描兩個表 while(i<sa->size && j<sb->size) { if(sa->a[i]<=sb->a[j]) { sc->a[k] = sa->a[i]; i++; k++; } else { sc->a[k] = sb->a[j]; j++; k++; } } //A表掃完,B組未掃完 if(i==sa->size) { for(; j<sb->size; j++) { sc->a[k] = sb->a[j]; k++; } } //反之 if(j==sb->size) { for(; i<sa->size; i++) { sc->a[k] = sa->a[i]; k++; } } sc->size=k; } //主函式 int main() { list s; init(&s); insert(&s,1,3); insert(&s,2,7); insert(&s,3,2); insert(&s,4,6); travel(&s); del(&s,3); travel(&s); insert_end(&s,1); travel(&s); sort(&s); travel(&s); is_empty(&s); search(&s,3); travel(&s); list sa; list sb; create(&sa); travel(&sa); create(&sb); travel(&sb); combine_1(&sa,&sb); travel(&sb); list ssa; list ssb; list ssc; create(&ssa); travel(&ssa); create(&ssb); travel(&ssb); combine_2(&ssa,&ssb,&ssc); travel(&ssc); return 0; }

執行結果:
這裡寫圖片描述