数据结构day1

顺序表的各种操作

顺序表的操作包括增删改查,细分出来包括:

创建一个空的顺序表

向顺序表中插入数据

遍历并打印数据

判断顺序表是否为空

判断顺序表是否为满

删除顺序表中数据并返回数据

根据数据修改数据

根据位置修改数据

根据位置查找数据

根据数据查找位置

一、本程序的各种函数操作

  1. 头文件和全局变量声明

#include<stdlib.h>
#include<stdio.h>
#include<stdbool.h>

#define N 128
typedef int datatype;   //重定义

typedef struct         //定义一个结构体
{
    datatype data[N];
    int last;
}seqlist;
  1. 创建一个空的顺序表

//创建一个空的顺序表
seqlist *seqlistCreate()
{
    seqlist *s = (seqlist*)malloc(size(seqlist));
    s->last = -1;
    return s;
}

//创建结构体时要考虑到内存的存储位置
//如果存储在栈区,函数结束后,内存被释放,无法在主函数中对顺序表进行后续的操作 —— 不可行,不可取
//如果存储在静态区,主函数结束,内存才被释放,可以在主函数中对顺序表进行后续的操作,但会造成一定的资源浪费 —— 可行,不可取
//如果存储在堆区,由程序员自主申请,自主释放,可以在主函数中对顺序表进行后续的操作 —— 可行,可取
  1. 向顺序表中插入数据

//向顺序表中插入数据
void seqlistInsert(seqlist *s,datatype)
{
    //判断是否为满
    if(seqlistlsFull(s))
{
        printf("本顺序表以满\n");
    return ;
}
        //last自增
    s->last++;
        //插入数据到last的位置
    s->data[s->last]=value;
    return;    
}
  1. 遍历并打印数据

//打印顺序表里数据
void seqlistPrint(seqlist *s)
{
    int i=0;
    for(i=0;i<=s->last;i++)
{
    printf("%d",s->data[i]);
}
    putcahr(10);
    return;
}
  1. 判断顺序表是否为空

//判断顺序表是否为空
bool seqlistIsEmpty(seqlist *s)
{
    if(s->last<0)
{
    return true;
}
    else
{
    return false;
}

//return s->last<0?true:false;//三目运算符
}
  1. 判断顺序表是否为满

//判断顺序表是否为满
bool seqlistIsEmpty(seqlist *s)
{
    if(s->last==N-1)
{
    return true;
}
    else
{
    return false;
}

//return s->last==N-1?true:false;//三目运算符
}
  1. 删除顺序表中数据并返回数据

//删除顺序表中数据并返回数据在主函数打印删除的数
datatype seqlistDelete(seqlist *s)
{
//如果顺序表为空,就不执行后续操作
    if(seqlistIsEmpty(s))
    {
        printf("这个顺序表是空的\n");
        return (datatype)-1;
    }
//用del临时存放将要删除的数据
    datatype del = s->data[s->last];
//last自减,删除(不访问的)数据
        s->last--;
        return del;
}
  1. 根据数据修改数据

//根据数据修改数据
void seqlistModifyDataByData(seqlist *s,datatype oldValue,datatype newValue)
{
    int i = 0;
    bool iFind = false;
    if(seqlistEmpty(s))
    {
        printf("这个顺序表是空的");
        return;
    }
    for(i=0;i<=s->last;i++)
    {
        if(s->data[i]==oldValue)
            {
                s->data[i] = newValue;
                iFind = true;
            }
    }
if(!iFind)
{
printf("所需的数值未查找到");
}
return;
}
  1. 根据位置修改数据

//根据位置修改数据
void seqlistModifyDataByPos(seqlist *s,int pos,datatype newValue)
{
    int i = 0;
    bool iFind = false;
    if(seqlistEmpty(s))
    {
        printf("这个顺序表是空的");
        return;
    }
    for(i=0;i<=last;i++)
    {
        if(i==pos)
            {
                s->data[i] = newValue;
                iFind = true;
            }
    }
if(!iFind)
{
printf("所需的数值未查找到");
}
return;
}
  1. 根据位置查找数据

datatype seqlistSearchDataByPos(seqlist *s, int pos)
{
 if(seqlistIsEmpty(s)){
        printf("本顺序表为空\n");
        return (datatype)-1;
    }
    if(pos < 0 || pos > s->last){
        printf("the pos you choosed(%d) is invalid\n", pos);
        return (datatype)-1;
    }
    return s->data[pos];
}//在主函数中接收改函数返回的数据值。
  1. 根据数据查找(第一个)数据的位置

int seqlistSearchPosByData(seqlist *s, datatype value){
    int i = 0;
    if(seqlistIsEmpty(s)){
        printf("the seqlist is empty\n");
        return -1;
    }
    for(i = 0; i <= s->last; i++){
        if(s->data[i] == value){
            return i;
        }
    }
    printf("the data you choosed(%d) is not exist\n", value);
    return -1;
}
  1. 在一个位置插入一个数

void seqlistlnsertbyPos(seqlist *s,int pos,datatype value)
{
    if(pos<0||pos>s->last+1)
    {
    printf("位置不合理\n");
    return ;
    }
    int i;
    for(i=s->last;i>=pos;i--)
    {
        s->data[i+1] = s->data[i];
    }
    s->data[pos]=value;
    s->last++;
    return;
}

13.删除某个位置的数,并返回这个数

datatype seqlistDeletetbyPos(seqlist *s,int pos)
{    
    
    if(pos < 0 || pos > N)
    {
    printf("位置不合理\n");
    return (datatype)-1;
    }
    int i;
    datatype del = s->data[pos];
    for(i=pos;i<=s->last;i++)
    {
        s->data[i] = s->data[i+1];
    } 
    s->last--;
    return del;
}

二、运行(在一个程序中)

#include<stdlib.h>
#include<stdio.h>
#include<stdbool.h>

#define N 128
typedef int datatype;
typedef struct
{
    datatype data[N];
    int last;
}seqlist;

seqlist *seqlistCreate();
void seqlistlnsert(seqlist *s, datatype value);
void seqlistPrint(seqlist*s);
datatype seqlistDelete(seqlist*s);
bool seqlistIsEmpty(seqlist *s);
bool seqlistIsFull(seqlist *s);
void seqlistModifyDataByData(seqlist *s,datatype oldValue,datatype newValue);

void seqlistModifyDataByPos(seqlist *s,int pos,datatype newValue);
void seqlistFindbyPos(seqlist *s,int pos);

void seqlistFindbyData(seqlist *s,datatype value);
void seqlistlnsertbyPos(seqlist *s,int pos,datatype value);
datatype seqlistDeletetbyPos(seqlist *s,int pos);



seqlist *seqlistCreate()
{
    seqlist *s = (seqlist*)malloc(sizeof(seqlist));
    s->last = -1;
    return s;
}

void seqlistlnsert(seqlist *s, datatype value)
{
    s->last++;
    s->data[s->last]=value;
    return;
}


void seqlistPrint(seqlist*s)
{
    int i=0;
        for (int i=0 ; i <= s->last; i++)
    {
        printf("%d ",s->data[i]);
    }
   putchar(10);
   return; 
}


datatype seqlistDelete(seqlist*s)
{
   if(seqlistIsEmpty(s))
   {
       printf("该文件为空\n");
       return (datatype)-1;
   }
    datatype del = s -> data[s->last];
    s->last--;

    return del;
}

bool seqlistIsEmpty(seqlist *s)
{
    if(s->last<0)
    {
        return true;
    }
    else
    {
        return false;
    }
    //return s->last <0?true:false;//三目运算符
}


bool seqlistIsFull(seqlist *s)
{
    if(s->last<N-1)
    {
        return true;
    }
    else
    {
        return false;
    }
    //return s->last <N-1?true:false;//三目运算符
}

void seqlistModifyDataByData(seqlist *s,datatype oldValue,datatype newValue)
{
    int i;
    bool iFind = false;
    if(seqlistIsEmpty(s))
    {
        printf("该文件为空\n");
       return ;
    }
    for(i=0;i<=s->last;i++)
    {
        if(s->data[i] == oldValue)
        {
            s->data[i] = newValue;
            iFind = true;
        }
    }
    if (!iFind)
    {
        printf("这个数据(%d)没有找到",oldValue);
    }
    return;
}

//根据位置修改
void seqlistModifyDataByPos(seqlist *s,int pos,datatype newValue)
{
    int i;
    bool iFind = false;
    if(seqlistIsEmpty(s))
    {
        printf("该文件为空\n");
       return ;
    }

    if(pos<0||pos>128)
    {
    printf("位置不合理\n");
    return ;
    }
        for(i=0;i<=s->last;i++)
    {
        if(i==pos)
        {
            s->data[i] = newValue;
            iFind = true;
        }
    }
    if (!iFind)
    {
        printf("这个位置(%d)没有找到",pos);
    }
    return;
}


//根据位置查找数据
void seqlistFindbyPos(seqlist *s,int pos)
{
    int i;
    bool flag = false;

    if(pos<0||pos>128)
    {
    printf("位置不合理\n");
    return ;
    }
        for(i=0;i<=s->last;i++)
    {
        if(i==pos)
        {
           printf("下标为%d的数值为:%d\n",pos,s->data[i]);
           flag=true;
        }
    }
    if (!flag)
    {
        printf("这个位置(%d)没有找到\n",pos);
    }
    return;
}

//根据数据查找位置
void seqlistFindbyData(seqlist *s,datatype value)
{
        int i;
    bool iFind = false;

        for(i=0;i<=s->last;i++)
    {
        if(s->data[i]==value)
        {
           printf("数值%d的下标为:%d\n",value,i);
           iFind=true;
        }
    }
    if (!iFind)
    {
        printf("这个数值(%d)没有找到\n",value);
    }
    return;
}


//在顺序表之间添加数据
void seqlistlnsertbyPos(seqlist *s,int pos,datatype value)
{
    if(pos<0||pos>s->last+1)
    {
    printf("位置不合理\n");
    return ;
    }
    int i;
    for(i=s->last;i>=pos;i--)
    {
        s->data[i+1] = s->data[i];
    }
    s->data[pos]=value;
    s->last++;
    return;
}


//在顺序表之间按下标删除数据
datatype seqlistDeletetbyPos(seqlist *s,int pos)
{
    
    printf("位置不合理\n");
    if(pos < 0 || pos > (s->last+1))
    {
    printf("位置不合理\n");
    return (datatype)-1;
    }
    int i;
    datatype del = s->data[pos];
    for(i=pos;i<=s->last;i++)
    {
        s->data[i] = s->data[i+1];
    } 
    s->last--;


    return del;
}


int main(int argc, char const *argv[])
{
    seqlist *s = seqlistCreate();
    seqlistlnsert(s,123);
    seqlistlnsert(s,126);
    seqlistlnsert(s,1);
    seqlistlnsert(s,16);
    seqlistlnsert(s,500);
    //seqlistPrint(s);
   // seqlistDelete(s);

    //printf("删除的数据为:%d\n",seqlistDelete(s));
    //seqlistModifyDataByData(s,1,126);
   // seqlistModifyDataByPos(s,3,999);
   //seqlistFindbyPos(s,2);

   //seqlistFindbyData(s,126);
    seqlistPrint(s);
    seqlistlnsertbyPos(s,3,1000);
    seqlistPrint(s);
    printf("%d\n",seqlistDeletetbyPos(s,2));
    seqlistPrint(s);
    free(s);
    return 0;
}

三、分文件编译

//seqlist.c
#include "seqlist.h"
//
seqlist *seqlistCreate()
{
    seqlist*s = (seqlist*) malloc(sizeof(seqlist)); 
    s->last = -1;
    return s;
}
//
void seqlistlnsert(seqlist *s, datatype value)
{
    s->last++;
    s->data[s->last]=value;
    return;
}
//
void seqlistPrint(seqlist*s)
{
    for(int i=0;i<=s->last;i++)
    {
        printf("%d ",s->data[i]);
    }
    printf("\n");
    return ;
}
//
bool seqlistIsFull(seqlist *s)
{
    if(s->last==N-1)
    {
        return true;
    }
    else
    {
        return false;
    }
}
//
bool seqlistIsEmpty(seqlist *s)
{
    if(s->last<0)
    {
        return true;
    }
    else
    {
        return false;
    }
}
//
datatype seqlistDelete(seqlist*s)
{
    //判断是否为空
    if(seqlistIsEmpty(s))
    {
        printf("该文件为空");
        return (datatype)-1;
    }
    datatype del = s -> data[s->last];
    s->last--;
    return del;
}
//
void seqlistModifyDataByData(seqlist *s,datatype oldValue,datatype newValue)
{
    
    int i = 0;
    bool flag = false;
    
    if(seqlistIsEmpty(s))
    {
        printf("该文件为空");
        return ;
    }
    for(i=0;i<=s->last;i++)
    {
        if(s->data[i] == oldValue)
        {
            s->data[i] = newValue;
            flag = true;
        }
    }
if(!flag)
{
    printf("为查找到该数值\n");
}
return;
}
//
void seqlistModifyDataByPos(seqlist *s,int pos,datatype newValue)
{
    
    int i = 0;
    bool flag = false;
    
    if(seqlistIsEmpty(s))
    {
        printf("该文件为空");
        return ;
    }

    if(pos>128||pos<0)
    {
        printf("该输入不合法\n");
        return;
    }


    for(;i<=s->last;i++)
    {
        if(i== pos)
        {
            s->data[i] = newValue;
            flag = true;
        }
    }
if(!flag)
{
    printf("为查找到该数值\n");
}
return;
}

//
datatype seqlistFindbyPos(seqlist *s,int pos)
{
        if(pos>128||pos<0)
    {
        printf("该输入不合法\n");
        return -1;
    }
        return s->data[pos];
}
//
datatype seqlistFindbyData(seqlist *s,int value)
{
    bool flag = false;
    for(int i=0;i<s->last;i++)
    {
        if(s->data[i]==value)
        {
            return i;
            flag = true;
        }
    }
    if (!flag)
    {
        printf("未查找到该下标");
    }
    return (datatype)-1;
}
//
void seqlistlnsertbyPos(seqlist *s,int pos,datatype value)
{
    if(pos<0||pos>s->last+1)
    {
    printf("位置不合理\n");
    return ;
    }
    int i;
    for(i=s->last;i>=pos;i--)
    {
        s->data[i+1] = s->data[i];
    }
    s->data[pos]=value;
    s->last++;
    return;
}
//
datatype seqlistDeletetbyPos(seqlist *s,int pos)
{    
    
    if(pos < 0 || pos > N)
    {
    printf("位置不合理\n");
    return (datatype)-1;
    }
    int i;
    datatype del = s->data[pos];
    for(i=pos;i<=s->last;i++)
    {
        s->data[i] = s->data[i+1];
    } 
    s->last--;
    return del;
}

//seqlist.h
#ifndef __FUN_H__
#define __FUN_H__


#include<stdlib.h>
#include<stdio.h>
#include<stdbool.h>
#define N 128

typedef int datatype;

typedef struct 
{
    datatype data[N];
    int last;
}seqlist;

//函数的声明
seqlist *seqlistCreate();
void seqlistlnsert(seqlist *s, datatype value);
void seqlistPrint(seqlist*s);
datatype seqlistDelete(seqlist*s);
bool seqlistIsEmpty(seqlist *s);
bool seqlistIsFull(seqlist *s);
void seqlistModifyDataByData(seqlist *s,datatype oldValue,datatype newValue);

void seqlistModifyDataByPos(seqlist *s,int pos,datatype newValue);
datatype seqlistFindbyPos(seqlist *s,int pos);

datatype seqlistFindbyData(seqlist *s,int value);
datatype seqlistDeletetbyPos(seqlist *s,int pos);
void seqlistlnsertbyPos(seqlist *s,int pos,datatype value);


#endif

//main.c
#include"seqlist.h"
int main(int argc, char const *argv[])
{
    datatype s = seqlistCreate();
    seqlistlnsert(s,1);
    seqlistlnsert(s,3);
    seqlistlnsert(s,9);
    seqlistlnsert(s,12);
    seqlistlnsert(s,76);
    seqlistlnsert(s,29);
    seqlistPrint(s);
    putchar(10);
    printf("%d\n",seqlistDelete(s));
    seqlistPrint(s);
    printf("*********************************\n");
    seqlistModifyDataByData(s,9,66666);
    seqlistPrint(s);
    seqlistModifyDataByPos(s,1,77777);
    seqlistPrint(s);
    printf("*********************************\n");
    printf("%d\n",seqlistFindbyPos(s,3));
    printf("%d\n",seqlistFindbyData(s,1));
    printf("*********************************\n");
    seqlistlnsertbyPos(s,1,199);
    seqlistPrint(s);
    printf("%d\n",seqlistDeletetbyPos(s,0));
    seqlistPrint(s);
    free(s);
    return 0;
}

//Makefile
OBJ=seqlist

${OBJ}:${OBJ}.o main.o

%*.o:%*.c

.PHONY:clean
clean:
    ${RM} *.o ${OBJ} 

四、运行结果

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值