当前位置:   article > 正文

数据结构代码实现——顺序表定义、插入、删除、查找_顺序表的删除操作代码

顺序表的删除操作代码

1.顺序表定义(静态分配)

基本操作

        InitList(&L):初始化表。构造一个空的线性表。

        用静态数组定义顺序表。由于数组的大小和空间已固定,一旦空间占满,再加入新的数据就会产生溢出。

  1. // 顺序表定义——静态分配
  2. #include <stdio.h>
  3. #define MaxSize 10 // 定义最大长度
  4. typedef struct {
  5. int data[MaxSize]; // 数组存储线性表
  6. int length; // 定义表长
  7. }SqList;
  8. // 初始化,初始值为0
  9. void InitList(SqList *L) {
  10. int i;
  11. for(i=0; i<MaxSize; i++) {
  12. L->data[i] = 0;
  13. }
  14. L->length = 0;
  15. }
  16. int main() {
  17. SqList L;
  18. InitList(&L);
  19. int i;
  20. for(i=0; i<MaxSize; i++) {
  21. printf("%d,",L.data[i]);
  22. }
  23. return 0;
  24. }

补充:

1、C语言关于结构体做参数传递:

https://blog.csdn.net/lin37985/article/details/38582027

若想在函数内改变结构体的值,需要给函数传递结构体的地址

用&L做实参,&L是结构体变量L的地址。在调用函数时将该地址传送给形参L(L是指针变量)。这样L就指向实参。

2、值传递与地址传递

        值传递:这种方式使用变量、常量、数组元素作为函数参数,实际是将实参的值复制到形参相应的存储单元中,即形参和实参分别占用不同的存储单元。

        地址传递:这种方式使用数组名或者指针作为函数参数,传递的是该数组的首地址或指针的值,而形参接收到的是地址,即指向实参的存储单元,形参和实参占用相同的存储单元,这种传递方式称为“参数的地址传递”。

准确定义:

        int *p;        p =  &x;        或

        int *p = &x;

        *p代表x地址处具体存放的数据;p代表x的地址值;&x代表x的地址值;x代表x地址处具体存放的数据。

3、结构体.与->的区别

看调用者的类型,如果调用者是指针,就在它后边用 ->;如果它不是地址,就在它后边就用 .

2.顺序表定义(动态分配)

基本操作

        InitList(&L):初始化表。构造一个空的线性表

        采用动态分配内存的方式定义顺序表。

        存储数组的空间是在程序执行过程中通过动态存储分配语句分配的,一旦数据空间占满,就另外开辟一块更大的存储空间,用来替换原来的存储空间,从而达到扩充存储数组空间的目的。原来的数据整体复制到新数组内。

  1. // 顺序表定义——动态分配
  2. #include<stdio.h>
  3. #include<malloc.h>
  4. #define InitSize 10 // 定义初始长度
  5. typedef struct {
  6. int *data; //数据头指针
  7. int MaxSize; //数据最大容量
  8. int length; //数组长度
  9. }SqList;
  10. void InitList(SqList *L) {
  11. L->data = (int*)malloc(InitSize * sizeof(int)); // 动态分配内存
  12. L->MaxSize = InitSize;
  13. int i;
  14. for(i=0; i<L->MaxSize; i++)
  15. L->data[i] = 0; // 设置默认值
  16. L->length = 0;
  17. }
  18. void IncreaseSize(SqList *L) {
  19. int *p = L->data;
  20. L->data = (int*)malloc((L->MaxSize+InitSize)*sizeof(int));
  21. int i;
  22. for(i=0; i<L->length; i++) {
  23. L->data[i] = p[i];
  24. }
  25. L->MaxSize = L->MaxSize + InitSize;
  26. for(i=L->length; i<L->MaxSize; i++) {
  27. L->data[i] = 0;
  28. }
  29. free(p);
  30. }
  31. int main() {
  32. SqList L;
  33. InitList(&L); // 初始化数组
  34. // 赋值0-9
  35. int i;
  36. for(i=0; i<L.MaxSize; i++) {
  37. L.data[i] = i;
  38. L.length++;
  39. }
  40. for(i=0; i<L.MaxSize; i++) {
  41. printf("%d,", L.data[i]);
  42. }
  43. printf("\n");
  44. if(L.length == L.MaxSize)
  45. IncreaseSize(&L);
  46. for(i=0; i<L.MaxSize; i++) {
  47. printf("%d,", L.data[i]);
  48. }
  49. return 0;
  50. }

 3.顺序表插入

基本操作:

        ListInsert(&L, i ,e):在顺序表的第i个位置插入e 

  1. //插入元素 ListInsert(&L, i ,e)
  2. #include<stdio.h>
  3. #include <stdbool.h>
  4. #define MaxSize 10
  5. typedef struct {
  6. int data[MaxSize]; //静态类型定义结构体
  7. int length;
  8. }SqList;
  9. //初始化顺序表
  10. void InitList(SqList *L) {
  11. for(int i=0; i<MaxSize; i++)
  12. L->data[i] = 0; //表内元素初始化为0
  13. L->length = 0;
  14. }
  15. bool ListInsert(SqList *L, int i, int e) { //在第i个位置插入e
  16. if(L->length >= MaxSize) { //合法性验证
  17. printf("顺序表已满");
  18. return false;
  19. }
  20. if(i<1 || i>L->length+1) {
  21. printf("输入不合法");
  22. return false;
  23. }
  24. for(int j=L->length; j>=i; j--) //定位
  25. L->data[j] = L->data[j-1]; //后移
  26. L->data[i-1] = e; //插入
  27. L->length++;
  28. return true;
  29. }
  30. int main() {
  31. SqList L;
  32. InitList(&L); //初始化数组
  33. for(int i=0; i<8; i++) { //给数组赋值【1-9
  34. L.data[i]=(i+1);
  35. L.length++;
  36. }
  37. for(int i=0; i<L.length; i++) //查看插入前的顺序表
  38. printf("%d ",L.data[i]);
  39. printf("\n");
  40. bool result = ListInsert(&L, 4, 14); //在第4个位序插入14
  41. for(int i=0; i<L.length; i++)
  42. printf("%d ",L.data[i]);
  43. return 0;
  44. }

4.顺序表删除

基本操作:

         ListDelete(&L,i,&e):删除第i个元素,并取回删除的值

  1. //顺序表删除 ListDelete(&L,i,&e)
  2. #define MaxSize 10
  3. #include<stdio.h>
  4. #include <stdbool.h>
  5. typedef struct { //定义数组结构体
  6. int data[MaxSize];
  7. int length;
  8. }SqList;
  9. //初始化顺序表
  10. void InitList(SqList *L) {
  11. for(int i=0; i<MaxSize; i++) //数组内元素置为0
  12. L->data[i] = 0;
  13. L->length = 0;
  14. }
  15. //顺序表删除
  16. bool ListDelete(SqList *L, int i, int *e) { //删除第i个元素,并取回删除的值
  17. if(i<1||i>L->length)
  18. return false;
  19. *e = L->data[i-1]; //查找
  20. for(int j=i; j<L->length; j++) //移位
  21. L->data[j-1] = L->data[j];
  22. L->length--;
  23. return true;
  24. }
  25. int main() {
  26. SqList L;
  27. InitList(&L); //初始化顺序表
  28. for(int i=0; i<8; i++) { //将顺序表赋值为【1-8
  29. L.data[i]=(i+1);
  30. L.length++;
  31. }
  32. int e = -1;
  33. if(ListDelete(&L, 3, &e)) //删除顺序表第3位元素,并返回该元素的值
  34. printf("已删除元素%d ", e);
  35. else
  36. printf("删除失败!");
  37. return 0;
  38. }

5.顺序表按位查找

基本操作:

         GetElem(&L,i):查找第i位元素的值,并获取该值

  1. //按位查找 GetElem(L,i)
  2.  
  3. #define MaxSize 10
  4. #include<stdio.h>
  5.  
  6. typedef struct { //结构体数组定义顺序表 
  7.     int data[MaxSize];
  8.     int length
  9. }SqList; 
  10.  
  11. //初始化顺序表 
  12. void InitList(SqList *L) { //将顺序表初始化为0 
  13.     for(int i=0; i<MaxSize; i++
  14.         L->data[i] = 0;
  15.     L->length = 0;
  16. }
  17.  
  18. //函数的默认返回值就是int型
  19. int GetElem(SqList *L, int i) { //查找第i位元素 
  20.     return L->data[i-1]; //返回第i位元素的值 
  21. }
  22.  
  23. int main() {
  24.     SqList L;
  25.     InitList(&L);
  26.     for(int i=0; i<8; i++) { //顺序表赋值位【0-7】 
  27.         L.data[i] = i;
  28.         L.length++;
  29.     }
  30.     int e = GetElem(&L, 4); //查找第4位元素的值 
  31.     printf("%d",e);
  32. }

6.顺序表按值查找

基本操作:

        LocateElem(&L, e):在顺序表中查找第一个值为e的元素,并返回其位序

  1. //顺序表按值查找
  2. # define MaxSize 10
  3. #include<stdio.h>
  4. typedef struct{ //结构体定义顺序表
  5. int data[MaxSize]; //数组
  6. int length;
  7. }SqList;
  8. //初始化顺序表
  9. void InitList(SqList *L) { //将顺序表置为0
  10. for(int i=0; i<MaxSize; i++) {
  11. L->data[i] = 0;
  12. }
  13. L->length = 0;
  14. }
  15. //在顺序表中查找第一个值为e的元素,并返回其位序
  16. int LocateElem(SqList *L, int e) {
  17. for(int i=0; i<L->length; i++)
  18. if(L->data[i] == e)
  19. return i+1;
  20. }
  21. int main() {
  22. SqList L;
  23. InitList(&L);
  24. for(int i=0; i<8; i++) { //给顺序表赋值【8-1
  25. L.data[i] = 8-i;
  26. L.length++;
  27. }
  28. int Elem = 3;
  29. int d = LocateElem(&L, Elem);
  30. printf("%d", d);
  31. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/486607
推荐阅读
相关标签
  

闽ICP备14008679号