c语言顺序表的基本操作

下面是顺序表的基本操作,c语言版的数据结构书上写的操作都实现了

因为总体代码太长如果写在一个class中要近500行,阅读和修改都不方便,所以采用分开写,希望大家以后写较长的程序时也采用这种方法,自己运行的所有功能都能实现,而且个人感觉界面还是比较人性化的,大家还有什么意见或者程序有什么问题都可以在评论区提出,我会及时修改的。

 
 
seqlist.h

#ifndef SEQLIST_H
#define SEQLIST_H
#include <stdio.h>
#include <malloc.h>
#define SEQLISR_INIT_SIZE 5
#define INC_SIZE 3

typedef int ElemType;
typedef struct Seqlist
{
    ElemType *base;//指针域
    int capacity;//顺序表容量
    int size;//表的大小
}Seqlist;

void create_list(Seqlist *list);//顺序表元素的输入
bool Inc(Seqlist *list);//增加顺序表的容量
void InitSeqlist(Seqlist *list);//初始化顺序表
void push_back(Seqlist *list,ElemType x);//在顺序表的末尾插入元素
void push_front(Seqlist *list,ElemType x);//在顺序表的头部插入元素
void show_list(Seqlist *list);//显示顺序表的元素
void pop_back(Seqlist *list);//删除顺序表的最后一个元素
void pop_front(Seqlist *list);//删除顺序表的第一个元素
void insert_pos(Seqlist *list,int pos,ElemType x);//在顺序表的指定位置插入数据
int find(Seqlist *list,ElemType key);//查找元素key的下标
int length(Seqlist *list);//求顺序表的长度
void delete_pos(Seqlist *list,int pos);//删除顺序表中指定位置的数据
void delete_val(Seqlist *list,int key);//删除顺序表中值为key的元素
void sort(Seqlist *list);//冒泡排序
void reverse(Seqlist *list);//逆置顺序表
void clear(Seqlist *list);//清除顺序表中的所有元素
void destroy(Seqlist *list);//摧毁顺序表
void merge(Seqlist *lt,Seqlist *la,Seqlist *lb);//吧两个表合为一个表



#endif // SEQLIST_H
seqlist.cpp

#include "seqlist.h"

void InitSeqlist(Seqlist *list)//初始化顺序表,创建一个名字为List的线性表,list通过结构体定义
{
    list->base=(ElemType*)malloc(sizeof(ElemType)*SEQLISR_INIT_SIZE);//对表list分配空间
    if(!list->base)
        exit(-1);
    list->capacity=SEQLISR_INIT_SIZE;//顺序表的容量
    list->size=0;//顺序表的大小/长度,表示当前顺序表中无任何内容
}

bool Inc(Seqlist *list)//增加顺序表的容量
{

    ElemType *newbase=(ElemType*)realloc(list,sizeof(ElemType)*(list->capacity+INC_SIZE));//重新分配内存空间,增减INC个容量
    if(newbase==NULL)
        printf("内存分配失败!");

    list->base=newbase;
    list->capacity+=INC_SIZE;

}

void create_list(Seqlist *list)
{
    int i,x;
    printf("请确定输入元素的个数:");
    scanf("%d",&i);
    printf("请输入元素\n");

    for(int j=0; j<i; j++)
    {
        scanf("%d",&x);
        list->base[j]=x;
    }
    list->size=i;
}

void push_back(Seqlist *list,ElemType x)//在顺序表的尾部插入元素
{
    if(list->size>=list->capacity&&!Inc(list))
    {
        printf("顺序表已满,无法在尾部插入新元素");
        return;
    }
    list->base[list->size]=x;
    list->size++;
}

void push_front(Seqlist *list,ElemType x)//在顺序表头部插入新元素
{
    if(list->size>=list->capacity&&!Inc(list))
    {
        printf("顺序表已满,无法在尾部插入新元素");
        return;
    }
    for(int i=list->size; i>0; i--)
    {
        list->base[i]=list->base[i-1];
    }
    list->base[0]=x;
    list->size++;
}

void show_list(Seqlist *list)//顺序表的打印输出
{
    for(int i=0; i<list->size; i++)
    {
        printf("%d\n",list->base[i]);
    }
}

void pop_front(Seqlist *list)//删除表头元素
{
    if(list->size==0)
    {
        printf("顺序表为空,无法删除元素");
        return;
    }
    for(int i=0; i<list->size-1; i++)
    {
        list->base[i]=list->base[i+1];
    }
    list->size--;
}

void pop_back(Seqlist *list)//删除最后一个元素
{
    if(list->size==0)
    {
        printf("顺序表为空,无法删除元素");
        return;
    }
    list->size--;//这也太聪明了,直接减少一个元素
}

int length(Seqlist *list)
{
    return list->size;
}

void insert_pos(Seqlist *list,int pos,ElemType x)//在指定位置插入元素
{
    if(pos<0||pos>list->size)
    {
        printf("插入位置不合法,无法插入元素");
        return;
    }
    if(list)
        for(int i=list->size; i>pos; i--)
        {
            list->base[i]=list->base[i-1];
        }
    list->base[pos]=x;
    list->size++;
}

int find(Seqlist *list,ElemType key)//寻找key的位置
{
    for(int i=0; i<list->size; i++)
    {
        if(list->base[i]==key)
            return i;
    }
    return -1;
}

void delete_pos(Seqlist *list,int pos)//删除指定位置的元素
{
    if(pos<0||pos>=list->size)
    {
        printf("删除位置不合法");
        return;
    }
    for(int i=pos; i<list->size-1; i++)
    {
        list->base[i]=list->base[i+1];
    }
    list->base--;
}

void delete_val(Seqlist *list,int key)//删除指定元素
{
    int pos=find(list,key);
    if(pos==-1)
    {
        printf("顺序表中没有这个元素");
        return;
    }
    delete_pos(list,pos);
}

void sort(Seqlist *list)
{
    for (int i = 0; i < list->size - 1; i++) //排序的趟数(例如5个数据需要比较4趟)
    {
        for (int j = 0; j < list->size - 1 - i; j++) //每一趟比较中的比较次数(例如5个数据在第0趟需要比较4次)
        {
            if (list->base[j] > list->base[j + 1])
            {
                ElemType temp = list->base[j];
                list->base[j] = list->base[j + 1];
                list->base[j + 1] = temp;
            }
        }
    }
}

void reverse(Seqlist *list)//将顺序表倒置
{
    if(list->size==0||list->size==1)
        return;
    int low=0,high=list->size-1;

    while(low<high)
    {
        ElemType temp=list->base[low];
        list->base[low]=list->base[high];
        list->base[high]=temp;
        low++;
        high--;
    }
}

void clear(Seqlist *list)
{
    list->size=0;
}

void destroy(Seqlist *list)//摧毁顺序表
{
    free(list->base);
    list->base=NULL;
    list->capacity=0;
    list->size=0;
}

void merge(Seqlist *lt,Seqlist *la,Seqlist *lb)//把两个顺序表合并为一个
{
    lt->capacity=la->size+lb->size;
    lt->base=(ElemType*)malloc(sizeof(ElemType)*lt->capacity);
    if(!lb->base)
        exit(-1);
    int ia=0,ib=0,ic=0;
    while(ia<la->size&&ib<lb->size)
    {
        if(la->base[ia]<lb->base[ib])
        {
            lt->base[ic++]=la->base[ia++];
        }
        else
        {
            lt->base[ic++]=lb->base[ib++];

        }
    }
    while(ia<la->size)
    {
        lt->base[ic++]=la->base[ia++];
    }
    while(ib<lb->size)
    {
        lt->base[ic++]=lb->base[ib++];
    }
    lt->size=la->size+lb->size;
    show_list(lt);
}


#include "seqlist.h"

int main()
{
    Seqlist list;
    InitSeqlist(&list);
    //create_list(&list);
    ElemType item;
    int pos;
    int select=1;
    printf("*******************************************\n");
    printf("*[1]  push_back        [2]  push_front    *\n");
    printf("*[3]  show_list        [4]  pop_back      *\n");
    printf("*[5]  pop_front        [6]  insert_pos    *\n");
    printf("*[7]  find             [8]  length        *\n");
    printf("*[9]  delete_pos       [10] delete_value  *\n");
    printf("*[11] sort             [12] reverse       *\n");
    printf("*[13] clear            [14] merge         *\n");
    printf("*[0]  quit_system                         *\n");
    printf("*******************************************\n");
    while(select)
    {

        printf("请选择:>>");
        scanf("%d",&select);
        if(select==0)
            break;
        switch(select)
        {
        case 1:
            printf("请输入要插入的数据(-1结束)");
            while(scanf("%d",&item),item!=-1)
            {
                push_back(&list,item);
            }
            break;
        case 2:
            printf("请输入要插入的数据(-1结束)");
            while(scanf("%d",&item),item!=-1)
            {
                push_front(&list,item);

            }
            break;
        case 3:
            show_list(&list);
            break;
        case 4:
            pop_back(&list);
            break;
        case 5:
            pop_front(&list);
            break;
        case 6:
            printf("请输入要插入的数据:");
            scanf("%d",&item);
            printf("请输入要插入的位置:");
            scanf("%d",&pos);
            insert_pos(&list,pos,item);
            break;
        case 7:
            printf("请输入要查找的数据:");
            scanf("%d",&item);
            pos=find(&list,item);
            if(pos=-1)
                printf("要查找的元素不在顺序表中");
            else
                printf("查找元素的在顺序表中的下标位置为:%d\n",pos);
            break;
        case 8:
            printf("顺序表的长度为%d",length(&list));
            break;
        case 9:
            printf("请输入要删除的值的下标位置:");
            scanf("%d",&pos);
            delete_pos(&list,pos);
            break;
        case 10:
            printf("请输入哟啊删除的值");
            scanf("%d",&item);
            delete_val(&list,item);
            break;
        case 11:
            sort(&list);
            break;
        case 12:
            reverse(&list);
            break;
        case 13:
            clear(&list);
            break;
        case 14:
            Seqlist mylist,yourlist;
            ElemType item1,item2;
            InitSeqlist(&mylist);
            InitSeqlist(&yourlist);
            printf("请输入顺序表1中的元素值");
            while(scanf("%d",&item1),item1!=-1)
            {
                push_back(&mylist,item1);
            }
            printf("请输入顺序表2中的元素值");
            while(scanf("%d",&item2),item2!=-1)
            {
                push_back(&yourlist,item2!=-1);
            }
            merge(&list,&mylist,&yourlist);
            destroy(&mylist);
            destroy(&yourlist);
            break;
        case 15:
            create_list(&list);//顺序表的创建,输入数据
            break;
        default:
            printf("输入的选择错误");
            break;


        }
    }
    destroy(&list);
}




猜你喜欢

转载自blog.csdn.net/qq_40741513/article/details/80866836
今日推荐