[c语言]数据结构 顺序表的实现

首先是main.cpp让我们来看看都有什么函数

#include<iostream>
#include"SeqList.h"
using namespace std;

int main()
{
    SeqList mylist;
    InitSeqList(&mylist);
    
    int select = 1;
    ElemType item = 0;
    ElemType pos = 0;
    ElemType ch = 0;
    while(select)
    {
        cout<<"**********************************"<<endl;
        cout<<"* [1] push_back   [2] push_front *"<<endl;
        cout<<"* [3] show_seqlist[0] quit_system*"<<endl;
        cout<<"* [4] pop_back    [5] pop_front  *"<<endl;
        cout<<"* [6] insert_pos  [7] insert_val *"<<endl;
        cout<<"* [8] delete_pos  [9] delete_val *"<<endl;
        cout<<"* [10] find       [11]getvalue   *"<<endl;
        cout<<"* [12] modify_val [13]modify_pos *"<<endl;
        cout<<"* [14] clear      [15]destroy    *"<<endl;
        cout<<"* [16] sort       [17]resver     *"<<endl;
        cout<<"* [18] length     [19]next       *"<<endl;
        cout<<"* [20] prio                      *"<<endl;
        cout<<"**********************************"<<endl;
        cout<<"plese chose:>";
        cin>>select;
        switch(select)
        {
            case 0:
                cout<<"quit successful!"<<endl;
                break;
            case 1:
                cout<<"please enter data end with -1:>";
                while(cin>>item,item!=-1)
                {
                    push_back(&mylist,item);
                }
                break;
            case 2:
                cout<<"please enter data end with -1:>";
                while(cin>>item,item!=-1)
                {
                    push_front(&mylist,item);
                }
                break;
            case 3:
                show(&mylist);
                break;
            case 4:
                pop_back(&mylist);
                cout<<"pop_back successful!"<<endl;
                break;
            case 5:
                pop_front(&mylist);
                cout<<"pop_front successful!"<<endl;
                break;
            case 6:
                cout<<"please enter position:>";
                cin>>pos;
                cout<<"please enter insert data:>";
                cin>>item;
                insert_pos(&mylist,pos,item);
                break;
            case 7:
                cout<<"please enter position:>";
                cin>>pos;
                cout<<"please enter insert data:>";
                cin>>item;
                insert_val(&mylist,pos,item);
                break;
            case 8:
                cout<<"please enter position:>";
                cin>>pos;
                delete_pos(&mylist,pos);
                break;
            case 9:
                cout<<"please enter delete data:>";
                cin>>item;
                delete_val(&mylist,item);
                break;
            case 10:
                cout<<"please enter find data:";
                cin>>item;
                cout<<"the position is :"<<find(&mylist,item)<<endl;
                break;
            case 11:
                cout<<"please enter position:>";
                cin>>pos;
                cout<<"the data is:"<<getvalue(&mylist,pos)<<endl;
                break;
            case 12:
                cout<<"please enter modify data:";
                cin>>item;
                cout<<"please enter change data:";
                cin>>ch;
                modify_val(&mylist,item,ch);
                break;
            case 13:
                cout<<"please enter modify postion:";
                cin>>pos;
                cout<<"please enter change data:";
                cin>>ch;
                modify_pos(&mylist,pos,ch);
                break;
            case 14:
                clear(&mylist);
                cout<<"clear successful!"<<endl;
                break;
            case 15:
                destroy(&mylist);
                cout<<"destory successful!";
                cout<<"Nothing operation can be used!Please quit!";
                break;
            case 16:
                sort(&mylist);
                cout<<"sort successful!"<<endl;
                break;
            case 17:
                resver(&mylist);
                cout<<"resver successful!"<<endl;
                break;
            case 18:
                cout<<length(&mylist)<<endl;
                break;
                
            case 19:
                cout<<"please enter postion:";
                cin>>pos;
                cout<<next(&mylist,pos)<<endl;
                break;
                
            case 20:
                cout<<"please enter postion:";
                cin>>pos;
                cout<<prio(&mylist,pos)<<endl;
                break;
                
            default:
                break;
                return 0;
        }
    }
}


然后是各个函数的实现,放在SeqList.cpp中

#include "SeqList.h"
void InitSeqList(SeqList *list)
{
    list->capacity = SEQLIST_DEFAULT_SIZE;
    list->base = (ElemType*)malloc(sizeof(ElemType)*list->capacity);
    assert(list->base != NULL);//断言
    list->size = 0;
}//开辟一个容量为10,大小为0的顺序表
bool isempty(SeqList *list)
{
    return (list->size == 0);
}//判断是否为空

bool isfull(SeqList *list)
{
    return list->size >= list->capacity;
}//判断是否为满

bool push_back(SeqList *list,ElemType x)
{
    if(isfull(list))
        return false;
    else
        list->base[list->size++] = x;
    return true;
}//后插
bool push_front(SeqList *list,ElemType x)
{
    if(isfull(list))
        return false;
    for(size_t i = list->size;i>0;i--)
    {
        list->base[i] = list->base[i-1];
    }
    list->base[0] = x;
    list->size++;
    return true;
}//前插//把前面腾出一个位置,从后向前
//bool push_back(SeqList *list,ElemType x)
//{
//    return insert_pos(list,end(list),x);
//}
//bool push_front(SeqList *list,ElemType x)
//{
//    return insert_pos(list,begin(),x);
//}

bool pop_back(SeqList *list)
{
    if(isfull(list))
        return false;
    else list->size--;
        return true;
}//后删
bool pop_front(SeqList *list)
{
    if(isfull(list))
        return false;
    for(int i = 0;i<list->size;i++)
    {
        list->base[i] = list->base[i+1];
    }
    list->size--;
    return true;
}//前删//把后面的数放到前面,从前向后

int find(SeqList *list,ElemType x)
{
    for(int i = 0;i<list->size;i++)
    {
        if(list->base[i] == x)
            return i;
    }
    return -1;
}//查找

void sort(SeqList *list)
{
    for(int i = 0;i<list->size;i++)
    {
        for(int j = 0;j < list->size-i-1;j++)
        {
            if(list->base[j] > list->base[j+1])
            {
                list->base[j]   ^=list->base[j+1];
                list->base[j+1] ^=list->base[j];
                list->base[j]   ^=list->base[j+1];
            }
        }
        
    }
}//排序(冒泡)
bool insert_pos(SeqList *list, ElemType p, ElemType x)//p是位置,x是数据
{
    if(isfull(list))
        return false;
    for(size_t i = list->size ;i>0; i--)
    {
        list->base[i] = list->base[i-1];
    }
    list->base[p] = x;
    list->size+=1;
    return true;
}//按位置插入

bool insert_val(SeqList *list, ElemType p, ElemType x)
{
    if(isfull(list))
        return false;
    sort(list);
    insert_pos(list,p,x);
    return true;
//    if(isfull(list))
//        return false;
//    if(q<0 ||q<100)
//        return false;
//
//    for(int i = list->size;i > 0;i--)
//    {
//        if(list->base[i] == x)
//            list->base[i] = list->base[i-1];
//        list->base[i] = q;
//    }
//    list->size++;
//    return true;

}//按值插入(先排序再插入指定位置)

bool delete_pos(SeqList *list, ElemType key)
{
    if(isempty(list)|| key < 0 || key > list->size-1)
        return false;
    for(int i = key;i<list->size;i++)
    {
        list->base[i] = list->base[i+1];
    }
    list->size--;
    return true;
}//按位置删除

bool delete_val(SeqList *list, ElemType x)
{
    if(isempty(list))
        return false;
    delete_pos(list,find(list,x));
    return true;
}//按值删除

int getvalue (SeqList *list,ElemType x)
{
    if(isempty(list) || x < 0 || x > list->size)
        return 0;
    for(int i = 0;i<list->size;i++)
    {
        if(x == i)
        return list->base[i];
    }
    return 0;
}//输入位置返回值

bool modify_val(SeqList *list,ElemType in,ElemType ch)
{
    if(isempty(list) || find(list,in) < 0 || find(list,in) > list->size)
        return false;
    list->base[find(list,in)] = ch;
    return true;
}//按值修改

bool modify_pos(SeqList *list,ElemType key,ElemType ch)
{
    if(isempty(list))
        return false;
    list->base[key] = ch;
    return true;
}//按位置修改

void show(SeqList *list)
{
    for(int i = 0;i<list->size;++i)
    {
        cout<<list->base[i]<<" ";
    }
    cout<<endl;
}//打印

void clear(SeqList *list)
{
    list->size = 0;
}//清除

bool destroy(SeqList *list)
{
    if(list->base)
        free(list->base);
    list->size = 0;
    list->capacity = 0;
    return true;
}//销毁

void resver(SeqList *list)
{
    int *p = &list->base[0];
    int *q = &list->base[list->size-1];
    for(;q > p;(q-- && p++))
    {
        *p = *p ^ *q;
        *q = *p ^ *q;
        *p = *p ^ *q;
    }
}//翻转

int next(SeqList *list,ElemType key)
{
    if(isempty(list) || key < 0 ||key > list->size-1)
        return 0;
    return list->base[key + 1];
}//后继

int prio(SeqList *list,ElemType key)
{
    if(isempty(list) || key < 1 ||key > list->size)
        return 0;
    return list->base[key - 1];
}//前驱

size_t length(SeqList *list)
{
    if(list->capacity==0)
        return -1;
    return list->size;
}//长度

最后是SeqList.h文件

#ifndef _SEQLIST_H
#define _SEQLIST_H

#include<iostream>
#include<assert.h>
using namespace std;

#define ElemType int//便于修改
#define SEQLIST_DEFAULT_SIZE 10

typedef struct SeqList
{
    ElemType *base;
    size_t    capacity;
    size_t    size;
}SeqList;

//int begin();
// end(SeqList *list);
void InitSeqList(SeqList *list);
bool isempty(SeqList *list);
bool isfull(SeqList *list);
bool push_back(SeqList *list,ElemType x);
bool push_front(SeqList *list,ElemType x);
bool pop_back(SeqList *list);
bool pop_front(SeqList *list);
bool insert_pos(SeqList *list, ElemType p, ElemType x);
bool insert_val(SeqList *list, ElemType p, ElemType x);
int find(SeqList *list,ElemType x);
void sort(SeqList *list);
bool delete_val(SeqList *list, ElemType x);
bool delete_pos(SeqList *list, ElemType key);
int getvalue (SeqList *list,ElemType x);
bool modify_val(SeqList *list,ElemType in,ElemType ch);
bool modify_pos(SeqList *list,ElemType key,ElemType ch);
void show(SeqList *list);
void clear(SeqList *list);
bool destroy(SeqList *list);
size_t length(SeqList *list);
void resver(SeqList *list);
int next(SeqList *list,ElemType key);
int prio(SeqList *list,ElemType key);
#endif


下面是运行结果的截图

push_back                                                         

    

push_front




pop_back


pop_front


insert_pos


insert_val


delete_pos


delete_val


find


get value


modify_val


modify_pos



resver


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,顺序表是一种常见的数据结构,它是一种线性表,元素按照顺序存储在连续的内存空间中。顺序表的查找操作是指在顺序表中根据给定的关键字查找对应的元素。 顺序表的查找可以分为两种常见的方式:顺序查找和二分查找。 1. 顺序查找(Sequential Search): 顺序查找是一种简单直接的查找方法,它从顺序表的第一个元素开始逐个比较,直到找到目标元素或者遍历完整个顺序表。具体步骤如下: - 从顺序表的第一个元素开始,依次与目标元素进行比较。 - 如果找到目标元素,则返回其在顺序表中的位置。 - 如果遍历完整个顺序表仍未找到目标元素,则返回查找失败。 2. 二分查找(Binary Search): 二分查找是一种高效的查找方法,但要求顺序表中的元素必须是有序的。它通过将目标元素与顺序表中间位置的元素进行比较,根据比较结果确定继续在左半部分还是右半部分进行查找,以此类推,最终找到目标元素或者确定不存在。具体步骤如下: - 将顺序表按照关键字的大小进行排序。 - 比较目标元素与顺序表中间位置的元素。 - 如果目标元素等于中间位置的元素,则返回其位置。 - 如果目标元素小于中间位置的元素,则在左半部分继续进行二分查找。 - 如果目标元素大于中间位置的元素,则在右半部分继续进行二分查找。 - 重复以上步骤,直到找到目标元素或者确定不存在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值