C语言(数据结构)顺序表的基本操作(增删改查)

在codeblock上通过两个.c文件和一个.h文件完成这个顺序表

我们把各种头文件包含在SeqList.h里面,把各种函数实现的功能放在SeqList.c文件里

main.c里面放我们的框架

main.c里的内容

#include "SeqList.h"
void menu()
{
    printf("**********************************************\n");
    printf("*******[1]push_back       [2]push_front*******\n");
    printf("*******[3]show_list       [4]insert************\n");
    printf("*******[5]pop_back        [6]pop_front*********\n");
    printf("*******[7]erase_pos       [8]erase_val**********\n");
    printf("*******[9]find            [10]size****************\n");
    printf("*******[11]sort           [12]reverse***************\n");
    printf("*******[13]clear          [14]quit******************\n");
    printf("*******[15]cls             ***************************\n");
    printf("***************************************************\n");

}
int main()
{
    SeqList list;
    initlist(&list);
    menu();
    int select=-1;
    int index=-1;
    int item=-1;
    while(1)
    {
        printf("请选择:>\n");
        scanf("%d",&select);
        switch(select)
        {
        case 1:
            printf("请输入要插入的元素:(输入-1就停止插入)>\n");
            while(scanf("%d",&item),item!=-1)
            {
                push_back(&list,item);
            }
            break;
        case 2:
            printf("请输入要插入的元素:>(输入-1就停止插入)\n");
            while(scanf("%d",&item),item!=-1);
            {
                push_front(&list,item);
            }
            break;
        case 3:
            printf("DATA:>\n");
            show_list(&list);
            break;
        case 4:
            printf("请输入要插入的下标和数据:>\n");
            scanf("%d%d",&index,&item);
            insert(&list,index,item);
            break;
        case 5:
            pop_back(&list);
            printf("尾部删除成功!\n");
            break;
        case 6:
            pop_front(&list);
            printf("头部删除成功!\n");
            break;
        case 7:
            printf("请输入要删除元素的下标:>\n");
            scanf("%d",&index);
            erase_pos(&list,index);
            printf("指定元素下标删除成功!\n");
            break;
        case 8:
            printf("请输入要删除的元素:>\n");
            scanf("%d",&item);
            erase_val(&list,item);
            printf("指定元素删除成功!\n");
            break;
        case 9:
            printf("请输入要查找的元素:>\n");
            scanf("%d",&item);
            int ret=find(&list,item);
            if(ret==-1)
            {
                printf("没有找到%d\n",item);
            }
            else
            {
                printf("找到了%d,下标是%d\n",item,ret);
            }
            break;
        case 10:
            printf("当前元素个数:%d\n",size(&list));
            break;
        case 11:
            sort(&list);
            break;
        case 12:
            reverse(&list);
            break;
        case 13:
            clear(&list);
            break;
        case 14:
            exit(0);
            break;
        case 15:
            system("cls");
            menu();
            break;
        }
    }
    return 0;
}
 

SeqList.h里的内容

#pragma  once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
#define  INIT_SEQLIST_SIZE 8//抽象数据类型
typedef int Data;
typedef struct
{
    Data* base;//指向首地址的指针
    int capacity;//数组的最大容量
    int size;//当前元素数量

}SeqList;

void initlist(SeqList* list);
void push_back(SeqList* list,Data data);
void show_list(SeqList* list);
void push_front(SeqList* list,Data data);
void insert(SeqList* list,int index,Data data);
bool empty(SeqList *list);
void pop_back(SeqList* list);
void pop_front(SeqList* list);
void erase_pos(SeqList* list,int index);
void erase_val(SeqList* list,Data data);
int find(SeqList* list,Data item);
int size(SeqList *list);
void sort(SeqList* list);
void reverse(SeqList* list);
void clear(SeqList* list);
 

SeqList.c 里的内容

#include "SeqList.h"
void initlist(SeqList *list)
{

    list->capacity=INIT_SEQLIST_SIZE;
    list->size=0;
    list->base=calloc(list->capacity,sizeof(Data));
    assert(list->base!=NULL);//如果分配失败,直接中断

}
void push_back(SeqList* list,Data data)
{

    if(list->capacity==list->size)
    {
        return;
    }
    list->base[list->size]=data;//插入数据
    list->size++;

}
void show_list(SeqList* list)
{

    int i=0;
    for(i=0;i<list->size;i++)
    {
        printf("%d ",list->base[i]);

    }
    printf("\n");
}
void push_front(SeqList* list,Data data)
{
    if(list->capacity==list->size)
    {
        return;
    }
    int i=0;
    //首元素移动
    for(i=list->size;i>0;i--)
    {
        list->base[i]=list->base[i-1];
    }
    list->base[0]=data;
    list->size++;
}
void insert(SeqList* list,int index,Data data)
{
    if(index<0 || index >list->size)
    {
        printf("插入位置错误!\n");
        return;
    }
    int i=0;
    for(i=list->size;i>index;i--)
    {
        list->base[i]=list->base[i-1];
    }
    list->base[index]=data;
    list->size++;
}
void pop_back(SeqList* list)
{
    if(!empty(list))
    {
        list->size--;
    }

}
bool empty(SeqList* list)
{
    return list->size==0;
}

void pop_front(SeqList* list)
{
    if(empty(list))
        return;
    int i=0;
    for(i=0;i<list->size-1;i++)
    {
        list->base[i]=list->base[i+1];
    }
    list->size--;
}

void erase_pos(SeqList* list,int index)
{
    if(empty(list))
        return;
    int i=0;
    for(i=index;i<list->size-1;i++)
    {
        list->base[i]=list->base[i+1];
    }
    list->size--;
}
void erase_val(SeqList* list,Data item)
{
    if(empty(list))
        return;
    int ret=find(list,item);
    if(ret!= -1)
    {
        if(ret==list->size-1)
            list->size--;
        else
        {

        int i=0;
        for(i=ret;i<=list->size-1;i++)
        {
            list->base[i]=list->base[i+1];
        }
        list->size--;
        }
    }
}
int find(SeqList* list,Data item)
{
  int i=0;
  for(i=0;i<list->size;i++)
  {
      if(list->base[i]==item)
      {
          return i;
      }
  }
  return -1;
}

int size(SeqList* list)
{
   return list->size;

}
void sort(SeqList* list)
{

    int i=0;
    int flag=1;
    for(i=0;i<list->size-1;i++)
    {
        flag=0;//重置flag=0说明当前序列已完全有序
        int j=0;
        for(j=0;j<list->size-1-i;j++)
        {
            if(list->base[j]>list->base[j+1])
            {
                Data temp=list->base[j];
                list->base[j]=list->base[j+1];
                list->base[j+1]=temp;
                flag=0;//说明不完全有序
            }
        }
        if(flag==1)
        {
            break;
        }
    }
}
void reverse(SeqList* list)
{

    int i=0;
    for(i=0;i<list->size/2;i++)//只需要遍历一半是因为在逆序操作中,从两端向中间交换元素即可完成整个逆序操作
    {
        Data t=list->base[i];//将第 i 个元素存储在临时变量 t 中
        list->base[i]=list->base[list->size-i-1];//将顺序表中的第 i 个元素置换为其对应位置上倒数第 i 个元素的值
        list->base[list->size-1-i]=t;//临时变量 t 的值赋给倒数第 i 个位置的元素,完成了对两个位置元素的交换。
    }
}
void clear(SeqList* list)
{
    list->size=0;
    free(list->base);
    list->base=NULL;
}

 

  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LMX---2015

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值