傲渊山岳 发表于 2024-12-17 05:47:50

快速把握C语言——数据结构【创建次序表】多文件编译

 1.数据结构脑图(未完)

https://i-blog.csdnimg.cn/direct/021ee78a34234ee1be0b8e75f01b5ae8.png
2.次序表其他操作 

https://i-blog.csdnimg.cn/direct/547df915389f4eaa8e90a400b33e001b.png
 3.功能函数封装

 https://i-blog.csdnimg.cn/direct/cac2d50ff598469b87272133fc251679.png
https://i-blog.csdnimg.cn/direct/39cd8c5bda0c4238887e2a60915a509d.png
https://i-blog.csdnimg.cn/direct/1156b296053d4854b29d1e5344ee6607.png 4 完整代码
1>头文件test.h

#ifndef __TEST_H__
#define __TEST_H__

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

//宏定义 线性表的最大容量
#define MAX 30

//类型重定义 表示要存放的数据的类型
//typedefintdatatype;

//定义顺序表的结构图类型
typedef struct sequence
{
        int data;
        int len;

}seqlist,*seqlistPtr;
//创建顺序表
seqlistPtr seq_create();
//判空
int empty(seqlistPtr S);
//判满
int fill(seqlistPtr S);
//尾部插入数据
int seq_add(seqlistPtr S,int e);
//遍历
void show(seqlistPtr S);
//任意位置插入1
int insert(seqlistPtr S,int index,int value);

//任意位置插入2
int index_add(seqlistPtr S,int index,int e);
//任意位置删除
int index_del(seqlistPtr S,int index);

//任意位置修改
void index_change(seqlistPtr S,int index,int e);
//按值查找
int value_index(seqlistPtr S, int e);
//去重
void repeat(seqlistPtr S);
//销毁
void my_free(seqlistPtr *S);

#endif
2.>源文件test.c

#include "test.h"
//1.
//    创建一个顺序表
seqlistPtr seq_create()
{//在堆区申请顺序表的大小空间,返回主程序使用
        seqlistPtr S=(seqlistPtr)malloc(sizeof(seqlist));
//判断申请空间是否合法
        if (NULL==S)
        {
                printf("创建失败\n");
                return NULL;
        }
        printf("创建成功\n");
//顺序表长度置零
        S->len=0;
//数组清空
        memset(S->data,0,sizeof(S->data));
        return S;
}

//2
//   判空
int empty(seqlistPtr S)
{
        //判断接受的顺序表是否为空
        if (NULL==S)
        {
                printf("判空失败\n");
                return -1;
        }
        //判断顺序表长度是否为0
        return S->len==0;
}

//3.
//   判满
int fill(seqlistPtr S)
{
        if (NULL==S)
        {
                printf("判满失败\n");
                return -1;
        }
//判断顺序表的长度和顺序表长度最大容量是否相等
        return S->len==MAX;
}

//4.
//    顺序表的增加
int seq_add(seqlistPtr S,int e)
{
        //判断接受的顺序表是否合法
        //判满
        if (NULL==S ||fill(S))
        {
                printf("增加失败\n");
                return 0;
        }
        //放入数据
        S->data=e;
        //增加成功顺序表长度自增
        S->len++;
        return 1;
}

//5
//   顺序表的遍历
void show(seqlistPtr S)
{
        //判断接受的顺序表是否合法
        //判空       
        if (NULL==S ||empty(S))
        {
                printf("遍历失败\n");
                return ;
        }
        for (int i=0;i<S->len;i++)
        {
                printf("%d ",S->data );
        }
        printf("\n");
}

//6
//   在顺序表插入一个数
int insert(seqlistPtr S,int index,int value)
{
        if (index <0||index>S->len||S->len>=MAX)
        {
                printf("插入位置不合法\n");
                return 0;
        }
        for (int i=S->len;i>index;i--)
        {
                S->data=S->data;
        }
        S->data=value;
        S->len++;
        return 1 ;

}

//7.
//在顺序表插入一个数方法2
int index_add(seqlistPtr S,int index,int e)
{
        if (NULL==S||fill(S)||index<=0||index>S->len+1)
        {
                printf("插入失败\n");
                return 0;
        }
        //        插入位置对应下标
        index= index-1;
        for(int i=0;i<S->len-index;i++)
        {
                S->data=S->data;
        }
        S->data=e;

        S->len++;
        return 1;
}

//8.
//   任意位置删除
int index_del(seqlistPtr S,int index)
{
        if (NULL==S||empty(S)||index<0||index>S->len)
        {

                printf("删除失败\n");
                return 0;
        }

        //        index-=1;
        for(int i= index;i<S->len;i++)
        {
                S->data=S->data;
        }
        S->len--;
        return 1;
}
//9.
//通过位置修改
void index_change(seqlistPtr S,int index,int e)
{
        if (NULL==S||empty(S)||index<0||index>S->len)
        {

                printf("修改失败\n");
                return ;
        }
        //修改
        //        S->data=e;
        S->data=e;

}

//10
//根据值查找下标
int value_index(seqlistPtr S, int e)
{
        if (NULL==S||empty(S))
        {

                printf("查找失败");
                return -1;
        }
        for (int i=0;i<S->len;i++)
        {
                if (S->data==e)
                {
                        printf("%d \n",i);
                        return i;
                }

        }
        printf("查无此数");
        return -1;
}
//11
//    去除重复数据
void repeat(seqlistPtr S)
{
        if (NULL==S||S->len<=1)
        {        printf("去重失败");
                return;
        }

        for (int i=0;i<S->len;i++)
        {
                for(int j=i+1;j<S->len;j++)
                        if (S->data==S->data)
                        {
                                index_del (S,j);
                                j--;
                        }

        }
}

// 12
//   释放内存
void my_free(seqlistPtr *S)
{
        if(NULL==*S)
        {
                printf("销毁失败");
                return ;
        }
        free (*S);

        S=NULL ;

        printf("销毁成功");
}
3>测试文件main.c

#include "test.h"

int main(int argc, const char *argv[])
{
        //创建顺序表
   seqlistPtr S=seq_create();

//顺序表的增加(尾插)
   seq_add(S,10);
   seq_add(S,20);
   seq_add(S,30);
   seq_add(S,40);
   seq_add(S,50);

   show(S);

//任意位置插入数据1方法
   insert(S,0,1);
   insert(S,1,2);
   insert(S,2,3);

   show(S);
//任意位置插入数据2方法
   index_add(S,5,666);

   show(S);

//删除指定位置的数据
        index_del(S,0);
        show(S);

//修改指定位置数据
        index_change(S,0,99);
        show(S);

//按值查找   
        value_index(S,666);
        show(S);

//按值查找并删除
        index_del(S,value_index(S,666));
        show(S);

//尾部插入多个数据
   seq_add(S,10);
   seq_add(S,20);
   seq_add(S,30);
   seq_add(S,10);
   seq_add(S,10);
   seq_add(S,20);
   seq_add(S,20);
   seq_add(S,40);
   seq_add(S,30);
   seq_add(S,50);
   show(S);

//去重
   repeat(S);
   show(S);


        return 0;
}
后续→c语言——数据结构【链表:单向链表】-CSDN博客



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 快速把握C语言——数据结构【创建次序表】多文件编译