Day15 3.15 数据结构

顺序表结构体增删改查

#ifndef __HEAD1_H__
#define __HEAD1_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int datatype;//int 重定义
#define MAXSIZE 10//线性表长度
//顺序表结构体
typedef struct
{
    datatype data[MAXSIZE];
    int len;
}seqlist;

seqlist *Create();
int full_fun(seqlist *p);
void insert_rear(seqlist *p,datatype e,int n);
void output(seqlist *p);
int delete_rear(seqlist *p);
int search(seqlist *p,int sub);
int update(seqlist *p,int sub,datatype e);
int insert_bysub(seqlist *p,int sub,datatype e);
int delete_bysub(seqlist *p,int sub);
int search_bykey(seqlist *p,datatype key);
int delete_bykey(seqlist *p,datatype key);
int update_bykey(seqlist *p,datatype key,datatype e);
void Bubble(seqlist *p);
seqlist *free_fun(seqlist *p);
#endif
#include "head1.h"
seqlist *Create()
{
    seqlist *p=(seqlist *)malloc(sizeof(seqlist));
    if(NULL==p)
        return NULL;
    p->len=0;
    return p;
}
int full_fun(seqlist *p)
{
    return p->len==MAXSIZE?-1:0;
}

int empty_fun(seqlist *p)
{
    return p->len==0?-1:0;
}

void insert_rear(seqlist *p,datatype e,int n)
{
    int i;
    for(i=0;i<n;i++){
        printf("请输入要插入的第%d个值:",i+1);
        scanf("%d",&e);
        //判满
        if(full_fun(p)){
            printf("表满插入失败\n");
            return;//结束函数
        }
        //不满就在尾部插入
        p->data[p->len]=e;
        p->len++;
    }
}

void output(seqlist *p)
{
    int i;
    for(i=0;i<p->len;i++){
        printf("%d\t",p->data[i]);
    }
    putchar('\n');
}

int delete_rear(seqlist *p)
{
    if(empty_fun(p)){
        printf("表空\n");
        return -1;
    }
    p->len--;
    return 0;
}

int search(seqlist *p,int sub)
{
    if(empty_fun(p)||sub<0||sub>=p->len){
        printf("查找失败\n");
        return -1;
    }
    printf("查找的元素是:%d\n",p->data[sub]);
    return 0;
}

int update(seqlist *p,int sub,datatype e)
{
    if(empty_fun(p)||sub<0||sub>=p->len){
        printf("修改失败\n");
            return -1;
    }
    p->data[sub]=e;
    return 0;
}

int insert_bysub(seqlist *p,int sub,datatype e)
{
    if(full_fun(p)||sub<0||sub>p->len){
        printf("插入失败\n");
        return -1;
    }
    int i;
    for(i=p->len-1;i>=sub;i--){
        p->data[i+1]=p->data[i];
    }
    p->data[sub]=e;
    p->len++;
    return 0;
}

int delete_bysub(seqlist *p,int sub)
{
    //1,判断顺序表是否为空
    //2,判断顺序表下标是否合法
    if(empty_fun(p)||sub<0||sub>=p->len)
    {
        printf("删除失败\n");
        return -1;
    }
    for(int i=sub;i<=p->len-1;i++)    {
        p->data[i]=p->data[i+1];
    }
    p->len--;
    return 0;
}

int search_bykey(seqlist *p,datatype key)
{
    for(int i=0;i<p->len;i++)
    {
        if(key==p->data[i])
        {
            return i;
        }
    }
    return -1;
}

int delete_bykey(seqlist *p,datatype key)
{
    int sub=search_bykey(p,key);
    if(sub==-1)
    {
        printf("删除的元素不存在\n");
        return -1;
    }
    int flag=delete_bysub(p,sub);
    if(flag==-1)
    {
        printf("按元素删除失败\n");
        return -1;
    }
    return 0;
}

int update_bykey(seqlist *p,datatype key,datatype e)
{
    int sub=search_bykey(p,key);
    if(sub==-1)
    {
        printf("修改的元素不存在\n");
        return -1;
    }
    int flag=update(p,sub,e);
    if(flag==-1)
    {
        printf("修改失败\n");
        return -1;
    }
    return 0;
}

void Bubble(seqlist *p)
{
    if(empty_fun(p)||1==p->len){
        printf("表空或者只有一个元素,无需排序\n");
        return -1;
    }
    int i,j;
    for(i=0;i<p->len-1;i++){
        for(j=0;j<p->len-i-1;j++){
            if(p->data[j]>p->data[j+1]){
                datatype t=p->data[j];
                p->data[j]=p->data[j+1];
                p->data[j+1]=t;
            }
        }
    }
}

seqlist *free_fun(seqlist *p)
{
    if(NULL!=p){
        free(p);
        p=NULL;
    }
    return p;
}
#include "head1.h"
#include "test1.c"
int main(int argc, const char *argv[])
{
    seqlist *p=Create();
    int n,e;
    printf("请输入个数:");
    scanf("%d",&n);
    //尾部插入
    insert_rear(p,e,n);
    //尾部删除
    delete_rear(p);
    printf("\n删除后的结果是\n");
    output(p);
    //下标查找
    int sub;
    printf("请输入需要查找的下标:\n");
    scanf("%d",&sub);
    search(p,sub);
    //下标修改
    printf("请输入修改的下标:\n");
    scanf("%d",&sub);
    printf("请输入修改的下标的值:\n");
    scanf("%d",&e);
    int flag=update(p,sub,e);
    if(0==flag)
        output(p);
    //按下标插入
    printf("请输入插入的下标:\n");
    scanf("%d",&sub);
    printf("请输入插入的值:\n");
    scanf("%d",&e);
    flag=insert_bysub(p,sub,e);
    if(0==flag)
        output(p);
    //按下标删除
    printf("请输入删除的下标:\n");
    scanf("%d",&sub);
    flag=delete_bysub(p,sub);
    if(0==flag)
        output(p);
    //按元素查找
    datatype key;
    printf("请输入查找的值:\n");
    scanf("%d",&key);
    flag=search_bykey(p,key);
    if(flag==-1)
        printf("查找的值不存在\n");
    else
        printf("查找的存在,为下标%d\n",flag);
    //按元素删除
    printf("请输入删除的元素:");
    scanf("%d",&key);
    flag=delete_bykey(p,key);
    if(flag==-1)
        printf("按元素删除失败\n");
    else
        output(p);
    //顺序表按元素修改
    printf("请输入要修改的元素:");
    scanf("%d",&key);
    printf("请输入修改后的值:");
    scanf("%d",&e);
    flag=update_bykey(p,key,e);
    if(flag==-1)
        printf("修改失败\n");
    else
        output(p);
    //顺序表排序
    Bubble(p);
    printf("排序后的结果为:");
    output(p);
    //顺序表空间释放
        p=free_fun(p);    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值