《数据结构:C语言实现序次表》

[复制链接]
发表于 2026-2-26 07:30:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、序次表

   序次表是线性表的一种,是一种数据结构,用来存放n个具有雷同特性的数据元素的有限序列。
序次表的存储情势的逻辑结构是一连的,物理结构也是一连的底层是数组来完成数据的存放。
  1、静态序次表

   静态序次表的空间是固定的,数组的巨细是固定的,存放数据的个数有限,以是给静态数据设置空间会往大了给,给小了不敷用,但给大了会产生空间浪费。
  2、动态序次表

   动态序次表根据内存空间必要调解空间巨细,很大程度上镌汰了空间的浪费,以是实现序次表用动态序次序次的情势实现。
  二、动态序次表实现

   实现动态序次表将创建三个文件来完成:
  

  • 1、squence_list.h 的头文件,声明函数,界说
  • 2、sequence_list.c的源文件实现函数的功能
  • 3、test.c 的源文件用来测试序次表的功能
  

1、创建自界说范例

   创建完成绩一步步实现
1、在squence_list.h的文件,起首要创建序次表所要用到的结构体自界说范例
  1. #pragma once
  2. //sequence_list.h文件中
  3. #include<stdio.h>
  4. //顺序表存放数据的类型
  5. typedef int SLDATETYPE;
  6. //顺序表的类型创建
  7. typedef struct SequenceList
  8. {
  9.         //存放指定类型数据的指针
  10.         SLDATETYPE* a;
  11.         //存放数据的有效个数
  12.         int count;
  13.         //属性表空间大小
  14.         int size;
  15. }SL;//重命名一个简单的名字
复制代码
2、完成序次表的创建,测试功能需求

   2、在test.c文件中创建一个序次表,然后在看必要什么功能,再来实现个个对应功能的函数。
  1. //在test.c文件中
  2. //1、首先包含头文件
  3. #include"sequence_list.h"
  4. //3、测试函数test1的任务
  5. void test1()
  6. {
  7.         //4、创建一个顺序表
  8.         SL s;
  9.         //5、顺序表没有初始化需要初始化
  10.         SLInitialize(&s);//传址调用
  11.         //6、最后不使用时要完成销毁
  12.         SLDestroy(&s);
  13. }
  14. //2、创建主函数
  15. int main()
  16. {
  17.         //调用测试函数
  18.         test1();
  19.         return 0;
  20. }
复制代码
3、完成序次表的初始化和烧毁功能

   3、根据需求必要对squence_list.h和squence_list.c的头文件完成对应的函数声明和实现
  

  • (1)序次表初始化
  • (2)序次表烧毁
  1. #pragma once
  2. //sequence_list.h文件中
  3. //包含检查头文件
  4. #include<assert.h>
  5. //动态内存开辟函数对应的头文件
  6. #include<stdlib.h>
  7. //顺序表的初始化
  8. void SLInitialize(SL* ps);
  9. //顺序表的销毁
  10. void SLDestroy(SL* ps);
复制代码
  1. //在squence_list.c文件中
  2. //包含头文件
  3. #include"sequence_list.h"
  4. //顺序表的初始化
  5. void SLInitialize(SL* ps)
  6. {
  7.         //对顺序表检查
  8.         //要添加对应的<assert.h>头文件
  9.         //在sequence_list.h头文件包含就可以了
  10.         assert(ps != NULL);
  11.         ps->a = NULL;
  12.         ps->count = ps->size = 0;
  13. }
  14. //顺序表的销毁
  15. void SLDestroy(SL* ps)
  16. {
  17.         assert(ps != NULL);
  18.        
  19.         //动态内存开辟的空间要free
  20.         //动态内存开辟函数要添加头文件<stdlib.h>
  21.         free(ps->a);
  22.         ps->a = NULL;
  23.         ps->count = ps->size = 0;
  24. }
复制代码
4、序次表插入数据和打印数据

   4、继续对test.c文件举行测试
必要的功能是添加数据的函数
添加数据的方式有三种:
  

  • (1)末了添加
  • (2)头部添加
  • (3)恣意位置添加
  必要观察数据,使用打印函数实现
  1. //在test.c文件中
  2. //1、首先包含头文件
  3. #include"sequence_list.h"
  4. //3、测试函数test1的任务
  5. void test1()
  6. {
  7.         //4、创建一个顺序表
  8.         SL s;
  9.         //5、顺序表没有初始化需要初始化
  10.         SLInitialize(&s);//传址调用
  11.         //添加数据
  12.         //7、尾部添加数据
  13.         SLPutEnd(&s, 1);
  14.         SLPutEnd(&s, 2);
  15.         SLPutEnd(&s, 3);
  16.         //8、打印数据
  17.         SLPrint(&s);
  18.         //9、头部插入
  19.         SLPutFirst(&s, 5);
  20.         SLPutFirst(&s, 4);
  21.         SLPrint(&s);
  22.         //10、任意位置前插入数据
  23.         SLInsert(&s, 0, 3);
  24.         SLInsert(&s, s.count-1, 6);
  25.         SLInsert(&s, 1, 6);
  26.         SLPrint(&s);
  27.        
  28.         //6、最后不使用时要完成销毁
  29.         SLDestroy(&s);
  30. }
  31. //2、创建主函数
  32. int main()
  33. {
  34.         //调用测试函数
  35.         test1();
  36.         return 0;
  37. }
复制代码
  1. //sequence_list.h文件中
  2. //判断空间是否足够
  3. void SLEnough(SL* ps)
  4. {
  5.         //空间满了申请空间
  6.         if (ps->count == ps->size)
  7.         {
  8.                 int n;
  9.                 n = (ps->size == 0 ? 4 : ps->size * 2);
  10.                 SLDATETYPE* tmp = (SLDATETYPE*)realloc(ps->a,n * sizeof(SLDATETYPE));
  11.                 if (tmp == NULL)
  12.                 {
  13.                         //开辟失败退出
  14.                         exit(1);
  15.                 }
  16.                 ps->a = tmp;
  17.                 tmp = NULL;
  18.                 ps->size = n;
  19.         }
  20. }
复制代码
  1. //顺序表末尾放置数据
  2. void SLPutEnd(SL* ps, SLDATETYPE x)
  3. {
  4.         assert(ps != NULL);
  5.         //判断空间是否足够容纳数据
  6.         SLEnough(ps);
  7.         ps->a[ps->count++] = x;
  8. }
  9. //打印顺序表中的数据
  10. void SLPrint(SL* ps)
  11. {
  12.         assert(ps != NULL);
  13.         int i = 0;
  14.         for (i = 0; i < ps->count; i++)
  15.         {
  16.                 printf("%d", ps->a[i]);
  17.         }
  18.         printf("\n");
  19. }
  20. //顺序表头部插入数据
  21. void SLPutFirst(SL* ps, SLDATETYPE x)
  22. {
  23.         assert(ps != NULL);
  24.         SLEnough(ps);
  25.         for (int i = ps->count; i > 0; i--)
  26.         {
  27.                 ps->a[i] = ps->a[i - 1];
  28.         }
  29.         ps->a[0] = x;
  30.         ps->count++;
  31. }
  32. //顺序表任意位置前插入数据
  33. void SLInsert(SL* ps, int pos, SLDATETYPE x)
  34. {
  35.         assert(ps != NULL);
  36.         assert(pos >= 0 && pos <= ps->count);
  37.         SLEnough(ps);
  38.         for (int i = ps->count; i > pos; i--)
  39.         {
  40.                 ps->a[i] = ps->a[i - 1];
  41.         }
  42.         ps->a[pos] = x;
  43.         ps->count++;
  44. }
复制代码
5、删除数据

   (1)尾部删除
(2)头部删除
(3)恣意位置删除
(4)探求对应数据下标
  三、序次表完成终极的代码

test.c文件中的代码:用来测试步调的可行性

  1. //在test.c文件中
  2. //1、首先包含头文件
  3. #include"sequence_list.h"
  4. //3、测试函数test1的任务
  5. void test1()
  6. {
  7.         //4、创建一个顺序表
  8.         SL s;
  9.         //5、顺序表没有初始化需要初始化
  10.         SLInitialize(&s);//传址调用
  11.         //添加数据
  12.         //7、尾部添加数据
  13.         SLPutEnd(&s, 1);
  14.         SLPutEnd(&s, 2);
  15.         SLPutEnd(&s, 3);
  16.         //8、打印数据
  17.         //SLPrint(&s);
  18.         //9、头部插入
  19.         SLPutFirst(&s, 4);
  20.         //SLPrint(&s);
  21.         //10、任意位置前插入数据
  22.         SLInsert(&s, 0, 5);
  23.         SLInsert(&s, 0, 6);
  24.        
  25.         SLPrint(&s);
  26.         //11、尾部删除数据
  27.         SLDeleteEnd(&s);
  28.         //l2、头部删除数据
  29.         SLDeleteFirst(&s);
  30.         //13、任意位置删除数据
  31.         SLDelete(&s, 0);
  32.         SLPrint(&s);
  33.         //14、查找数据对应下标
  34.         int ret=SLFind(&s, 6);
  35.         if (ret >= 0)
  36.         {
  37.                 printf("找到了,下标为%d\n",ret);
  38.         }
  39.         else
  40.                 printf("没有找到");
  41.         //6、最后不使用时要完成销毁
  42.         SLDestroy(&s);
  43. }
  44. //2、创建主函数
  45. int main()
  46. {
  47.         //调用测试函数
  48.         test1();
  49.         return 0;
  50. }
复制代码
sequence_list.h头文件:

  1. #pragma once
  2. //sequence_list.h文件中
  3. #include<stdio.h>
  4. //包含检查头文件
  5. #include<assert.h>
  6. //动态内存开辟函数对应的头文件
  7. #include<stdlib.h>
  8. //顺序表存放数据的类型
  9. typedef int SLDATETYPE;
  10. //顺序表的类型创建
  11. typedef struct SequenceList
  12. {
  13.         //存放指定类型数据的指针
  14.         SLDATETYPE* a;
  15.         //存放数据的有效个数
  16.         int count;
  17.         //属性表空间大小
  18.         int size;
  19. }SL;//重命名一个简单的名字
  20. //顺序表的初始化
  21. void SLInitialize(SL* ps);
  22. //顺序表的销毁
  23. void SLDestroy(SL* ps);
  24. //判断空间是否足够
  25. void SLEnough(SL* ps);
  26. //顺序表末尾放置数据
  27. void SLPutEnd(SL* ps, SLDATETYPE x);
  28. //打印顺序表中的数据
  29. void SLPrint(SL* ps);
  30. //顺序表头部插入数据
  31. void SLPutFirst(SL* ps, SLDATETYPE x);
  32. //顺序表任意位置前插入数据
  33. void SLInsert(SL* ps, int pos, SLDATETYPE x);
  34. //顺序表尾删
  35. void SLDeleteEnd(SL* ps);
  36. //顺序表头删
  37. void SLDeleteFirst(SL* ps);
  38. //顺序表任意位置删除数据
  39. void SLDelete(SL* ps, int pos);
  40. //顺序表中寻找对应数据下标
  41. int SLFind(SL* ps, SLDATETYPE x);
复制代码
sequence_list.c文件:

  1. #define _CRT_SECURE_NO_WARNINGS 1//在squence_list.c文件中
  2. //包含头文件
  3. #include"sequence_list.h"
  4. //顺序表的初始化
  5. void SLInitialize(SL* ps)
  6. {
  7.         //对顺序表检查
  8.         //要添加对应的<assert.h>头文件
  9.         //在sequence_list.h头文件包含就可以了
  10.         assert(ps != NULL);
  11.         ps->a = NULL;
  12.         ps->count = ps->size = 0;
  13. }
  14. //顺序表的销毁
  15. void SLDestroy(SL* ps)
  16. {
  17.         assert(ps != NULL);
  18.        
  19.         //动态内存开辟的空间要free
  20.         //动态内存开辟函数要添加头文件<stdlib.h>
  21.         free(ps->a);
  22.         ps->a = NULL;
  23.         ps->count = ps->size = 0;
  24. }
  25. //判定空间是否富足void SLEnough(SL* ps){        //空间满了申请空间        if (ps->count == ps->size)        {                int n;                n = (ps->size == 0 ? 4 : ps->size * 2);                SLDATETYPE* tmp = (SLDATETYPE*)realloc(ps->a,n * sizeof(SLDATETYPE));                if (tmp == NULL)                {                        //开辟失败退出                        exit(1);                }                ps->a = tmp;                tmp = NULL;                ps->size = n;        }}
  26. //顺序表末尾放置数据
  27. void SLPutEnd(SL* ps, SLDATETYPE x)
  28. {
  29.         assert(ps != NULL);
  30.         //判断空间是否足够容纳数据
  31.         SLEnough(ps);
  32.         ps->a[ps->count++] = x;
  33. }
  34. //打印顺序表中的数据
  35. void SLPrint(SL* ps)
  36. {
  37.         assert(ps != NULL);
  38.         int i = 0;
  39.         for (i = 0; i < ps->count; i++)
  40.         {
  41.                 printf("%d", ps->a[i]);
  42.         }
  43.         printf("\n");
  44. }
  45. //顺序表头部插入数据
  46. void SLPutFirst(SL* ps, SLDATETYPE x)
  47. {
  48.         assert(ps != NULL);
  49.         SLEnough(ps);
  50.         for (int i = ps->count; i > 0; i--)
  51.         {
  52.                 ps->a[i] = ps->a[i - 1];
  53.         }
  54.         ps->a[0] = x;
  55.         ps->count++;
  56. }
  57. //顺序表任意位置前插入数据
  58. void SLInsert(SL* ps, int pos, SLDATETYPE x)
  59. {
  60.         assert(ps != NULL);
  61.         assert(pos >= 0 && pos <= ps->count);
  62.         SLEnough(ps);
  63.         for (int i = ps->count; i > pos; i--)
  64.         {
  65.                 ps->a[i] = ps->a[i - 1];
  66.         }
  67.         ps->a[pos] = x;
  68.         ps->count++;
  69. }
  70. //序次表尾删void SLDeleteEnd(SL* ps){        assert(ps != NULL);        if (ps->count == 0)        {                printf("数据已经删完了\n");        }        else        {                ps->count--;                printf("删除乐成\n");        }}//序次表头删void SLDeleteFirst(SL* ps){        assert(ps != NULL);        if (ps->count == 0)        {                printf("数据已经删完了\n");        }        else        {                for (int i = 0; i < ps->count - 1; i++)                {                        ps->a[i] = ps->a[i + 1];                }                ps->count--;                printf("删除乐成\n");        }}//序次表恣意位置删除数据void SLDelete(SL* ps, int pos){        assert(ps != NULL);        assert(pos >= 0 && pos <= ps->count);        if (ps->count == 0)        {                printf("数据已经删完了\n");        }        else        {                for (int i = pos; i < ps->count - 1; i++)                {                        ps->a[i] = ps->a[i + 1];                }                ps->count--;                printf("删除乐成\n");        }}//序次表中探求对应数据下标int SLFind(SL* ps, SLDATETYPE x){        assert(ps != NULL&&ps->a != NULL);        for (int i = 0; i < ps->count; i++)        {                if (ps->a[i] == x)                {                        return 1;                }        }        return -1;}
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表