資料結構——順序表操作(C語言實現)
阿新 • • 發佈:2018-12-10
//順序表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;
}
執行結果: