数据结构——顺序表操作(C语言实现)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Nicht_sehen/article/details/82716085
//顺序表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;
} 

运行结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/Nicht_sehen/article/details/82716085