当前位置:   article > 正文

c语言顺序表操作实验报告_数据结构c语言版顺序表的基本操作实验心得

数据结构c语言版顺序表的基本操作实验心得

数据结构 c语言顺序表操作实验报告

1 实验内容

需要完成的功能:

1.建立一个长度为N的顺序表。
2.输出该顺序表的各个元素以及相应的下标。
3.在顺序表的第i个位置里插入元素x,并且输出插入元素后顺序表中各个元素以及相应的下标。
4.删除顺序标中第i个位置的元素,并且输出删除元素后顺序表中各个元素以及相应的下标。
5.在顺序表中找到x元素,并且返回该元素的位置,如果没有找到该元素x,则输出“顺序表中没有该元素”。
6.输出该顺序标中的最大值m和次最大值n。
7.初始化(清空)该顺序表中的所有元素。

1、程序所包含的头文件和定义。

#include<stdio.h>
#include<stdlib.h>    //包含了创建顺序表所需的malloc()函数和realloc()函数
typedef int ElemType;    //自定义int类型变量的别名ElemType
#define MAXSIZE  100         //表的最大长度
typedef struct {         //定义顺序表的结构体变量
	ElemType *data;			//数据域
	int length;			//存储目前表的长度
	int initsize;   //表的容量
}sqlist;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2、顺序表的建立。

void InitList(sqlist* L, int size) {
    L->data = (ElemType*)malloc(size * sizeof(ElemType));
    L->length = 0;
    L->initsize = size;
}
  • 1
  • 2
  • 3
  • 4
  • 5

3、顺序表数据的输出。

void PrintList(sqlist* L) {
    int i;
    printf("顺序表中的元素及相应下标:\n");
    for (i = 0; i < L->length; i++) {
        printf("下标:%d,元素:%d\n", i, L->data[i]);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4、插入操作。

void InsertList(sqlist* L, int i, ElemType x) {
    int j;
    if (i < 0 || i > L->length) {  
        printf("插入位置错误!\n");
        return;
    }
    if (L->length >= L->initsize) {
        ElemType* newdata = (ElemType*)realloc(L->data, 
            (L->initsize + MAXSIZE) * sizeof(ElemType));
        if (newdata == NULL) {
            printf("内存分配失败!\n");
            return;
        }
        L->data = newdata;
        L->initsize += MAXSIZE;
    }
    for (j = L->length; j > i; j--) {
        L->data[j] = L->data[j - 1];
    }
    L->data[i] = x;
    L->length++;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

5、删除元素操作。

void DeleteList(sqlist* L, int i) {
    int j;
    if (i < 0 || i >= L->length) {
        printf("删除位置错误!\n");
        return;
    }
    for (j = i; j < L->length - 1; j++) {
        L->data[j] = L->data[j + 1];
    }
    L->length--;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

6、查找元素。

int SearchList(sqlist* L, ElemType x) {
    int i;
    for (i = 0; i < L->length; i++) {
        if (L->data[i] == x) {
            return i;
        }
    }
    return -1;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

7、输出最大值和次最大值。

void FindMax(sqlist* L) {
    int max = L->data[0];
    int second_max = L->data[0];
    int i;
    for (i = 1; i < L->length; i++) {
    //找出最大值赋值给max前先把max保存到次最大值中
        if (L->data[i] > max) {
            second_max = max;
            max = L->data[i];
        }
        //若当前数值不是最大值也要判断一下当前值是否比次最大值大
        else if (L->data[i] > second_max && L->data[i] < max) {   //找出次最大值
            second_max = L->data[i];
        }
    }
    printf("最大值:%d,次最大值:%d\n", max, second_max);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

8、清空顺序表。(逻辑上的清空)

void ClearList(sqlist* L) {       //清表
    L->length = 0;
}

  • 1
  • 2
  • 3
  • 4

9、主函数。

int main() {
    sqlist List;
    int N, i=-100, x=-100, index,y;
    char c;
    printf("请输入顺序表的长度(N):");
    scanf_s("%d", &N);

    InitList(&List, N);

    printf("请输入顺序表的元素:\n");
    for (i = 0; i < N; i++) {
        scanf_s("%d", &List.data[i]);
        List.length++;
    }
     while ((c = getchar()) != '\n' && c != EOF) {}
    //简单的菜单界面
    printf("------------***************------------\n");
    printf("输入下面数字分别进行不同的操作!\n");
    printf("1:输出顺序表元素及其下标\n");
    printf("2:插入元素\n");
    printf("3:删除元素\n");
    printf("4:查找元素\n");
    printf("5:输出元素最大值和次最大值\n");
    printf("6:清空顺序表\n");
    printf("0:退出程序\n");
    
   do {
        scanf_s("%d", &y);
        switch (y) {
        case 1:
            PrintList(&List); 
            break;

        case 2:
            
            printf("请输入要插入的位置和元素(i, x):");
            scanf_s("%d,%d", &i, &x);
//判断数据是否成功输入
//-100的目的只是判断i和x的值是否读取成功,可以改为别的。
            if (i == -100 || x == -100) {
                printf("输入有误!\n");
               {   printf("------------***************------------\n");
                printf("输入下面数字分别进行不同的操作!\n");
                printf("1:输出顺序表元素及其下标\n");
                printf("2:插入元素\n");
                printf("3:删除元素\n");
                printf("4:查找元素\n");
                printf("5:输出元素最大值和次最大值\n");
                printf("6:清空顺序表\n");
                printf("0:退出程序\n");
            }

               /*读取缓冲区中的数据,防止对后面数据进行干扰,其实可以省略*/
                while ((c = getchar()) != '\n' && c != EOF) {} 
                break; 
            }
            InsertList(&List, i, x);
            PrintList(&List);
            break;
        case 3:
            printf("请输入要删除的位置(i):");
            scanf_s("%d", &i);
            DeleteList(&List, i);
            PrintList(&List);
            break;
        case 4:
            printf("请输入要查找的元素(x):");
            scanf_s("%d", &x);
            index = SearchList(&List, x);
            if (index != -1) {
                printf("元素 %d 在顺序表中的位置为:%d\n", x, index);
            }
            else {
                printf("顺序表中没有该元素!\n");
            }
            break;
        case 5:

            FindMax(&List); 
            break;
        case 6:
            ClearList(&List);
            printf("清空后的顺序表:\n");
            PrintList(&List);
            free(List.data); 
            break;
        default:
            y = 0;
     
        }
   } while (y);
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93

2运行测试

在这里插入图片描述
在这里插入图片描述

3小结

从这次实验中我对顺序表的操作有了更深层次的了解,顺序表的实现相对简单,主要涉及到数组的初始化、插入、删除、查找等操作。在插入和删除元素时,需要注意元素的移动和顺序的调整,以保持顺序表的有序性。
顺序表的空间是固定的,如果要增加空间,就必须先申请出空间。相对于链表来说,顺序表的优点是可以快速访问任意位置的元素,缺点就是不够灵活,如果需要大量迁移数据的话,会导致效率降低。

完整代码

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

typedef int elemtype;
#define maxsize 100

typedef struct {
    elemtype* data;
    int length;
    int initsize;
} sqlist;

//新建表
void initlist(sqlist* l, int size) {
    l->data = (elemtype*)malloc(size * sizeof(elemtype));
    l->length = 0;
    l->initsize = size;
}

//输出表中的数据及其下标
void printlist(sqlist* l) {
    int i;
    printf("顺序表中的元素及相应下标:\n");
    for (i = 0; i < l->length; i++) {
        printf("下标:%d,元素:%d\n", i, l->data[i]);
    }
}

//插入
void insertlist(sqlist* l, int i, elemtype x) {
    int j;
    if (i < 0 || i > l->length) {  
        printf("插入位置错误!\n");
        return;
    }
    if (l->length >= l->initsize) {
        elemtype* newdata = (elemtype*)realloc(l->data, 
            (l->initsize + maxsize) * sizeof(elemtype));
        if (newdata == null) {
            printf("内存分配失败!\n");
            return;
        }
        l->data = newdata;
        l->initsize += maxsize;
    }
    for (j = l->length; j > i; j--) {
        l->data[j] = l->data[j - 1];
    }
    l->data[i] = x;
    l->length++;
}

//删除元素
void deletelist(sqlist* l, int i) {
    int j;
    if (i < 0 || i >= l->length) {
        printf("删除位置错误!\n");
        return;
    }
    for (j = i; j < l->length - 1; j++) {
        l->data[j] = l->data[j + 1];
    }
    l->length--;
}

//查找元素 返回位置
int searchlist(sqlist* l, elemtype x) {
    int i;
    for (i = 0; i < l->length; i++) {
        if (l->data[i] == x) {
            return i;
        }
    }
    return -1;
}

//找最大值和次最大值
void findmax(sqlist* l) {
    int max = l->data[0];
    int second_max = l->data[0];
    int i;
    for (i = 1; i < l->length; i++) {
        if (l->data[i] > max) {
            second_max = max;
            max = l->data[i];
        }
        else if (l->data[i] > second_max && l->data[i] < max) {   //找出次最大值
            second_max = l->data[i];
        }
    }
    printf("最大值:%d,次最大值:%d\n", max, second_max);
}

void clearlist(sqlist* l) {       //清表
    l->length = 0;
}

int main() {
    sqlist list;
    int n, i=-100, x=-100, index,y;
    char c;
    printf("请输入顺序表的长度(n):");
    scanf_s("%d", &n);

    initlist(&list, n);

    printf("请输入顺序表的元素:\n");
    for (i = 0; i < n; i++) {
        scanf_s("%d", &list.data[i]);
        list.length++;
    }
     while ((c = getchar()) != '\n' && c != EOF) {}
    printf("------------***************------------\n");
    printf("输入下面数字分别进行不同的操作!\n");
    printf("1:输出顺序表元素及其下标\n");
    printf("2:插入元素\n");
    printf("3:删除元素\n");
    printf("4:查找元素\n");
    printf("5:输出元素最大值和次最大值\n");
    printf("6:清空顺序表\n");
    printf("0:退出程序\n");
    
   do {
        scanf_s("%d", &y);
        switch (y) {
        case 1:
            printlist(&list); 
            break;

        case 2:
            
            printf("请输入要插入的位置和元素(i, x):");
            scanf_s("%d,%d", &i, &x);
            if (i == -100 || x == -100) 
            {
                printf("输入有误!\n");
               {  
                printf("------------***************------------\n");
                printf("输入下面数字分别进行不同的操作!\n");
                printf("1:输出顺序表元素及其下标\n");
                printf("2:插入元素\n");
                printf("3:删除元素\n");
                printf("4:查找元素\n");
                printf("5:输出元素最大值和次最大值\n");
                printf("6:清空顺序表\n");
                printf("0:退出程序\n");
            }

               //读取缓冲区中的数据,防止对后面数据进行干扰
                while ((c = getchar()) != '\n' && c != eof) {} 
                break; 
            }
            insertlist(&list, i, x);
            printlist(&list);
            break;
        case 3:
            printf("请输入要删除的位置(i):");
            scanf_s("%d", &i);
            deletelist(&list, i);
            printlist(&list);
            break;
        case 4:
            printf("请输入要查找的元素(x):");
            scanf_s("%d", &x);
            index = searchlist(&list, x);
            if (index != -1) {
                printf("元素 %d 在顺序表中的位置为:%d\n", x, index);
            }
            else {
                printf("顺序表中没有该元素!\n");
            }
            break;
        case 5:

            findmax(&list); 
            break;
        case 6:
            clearlist(&list);
            printf("清空后的顺序表:\n");
            printlist(&list);
            free(list.data); 
            
        default:
            y = 0;
            break;
        }
   } while (y);
  
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190

需要注意的是我这里用的是scanf_s,有些编译器需要把_s去掉
即scanf。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/590803
推荐阅读
相关标签
  

闽ICP备14008679号