目录

顺序表操作 | 数据结构

创建顺序表

1
2
3
4
    typedef struct node{
    DataType data[MAXSIZE];
    int length;
    } SeqList, *PSeqList;

初始化

1
2
3
4
5
6
7
8
    PSeqList Init_SeqList(void)
    {
    PSeqList PL;
    PL = (PSeqList)malloc(sizeof(SeqList));
    if (PL)
        PL->length = 0;
    return PL;
    }

添加

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    int Insert_SeqList(PSeqList PL, int i, DataType x)
    {
    int j;
    if (!PL)
    {
        printf("表不存在");
        return (-2);
    }
    if (PL->length >= MAXSIZE)
    {
        printf("表溢出");
        return (-1);
    }
    if (i < 1 || i > PL->length)
    {
        printf("插入位置异常");
        return 0;
    }
    for (j = PL->length - 1; j >= i - 1; j--)
        PL->data[j + 1] = PL->data[j];
    PL->data[i - 1] = x;
    PL->length++;
    return 1;
    }

检索

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
    int Location_SeqList(PSeqList L, DataType x)
    {
    int i = 0;
    while (i < L->length && L->data[i] != x)
        i++;
    if (i >= L->length){
        printf("检索数据异常、n");
        return 0;
    }
    else
        return (i + 1);
    }

删除

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
    int Delete_SeqList(PSeqList PL, int i)
    {
    int j;
    if (!PL)
    {
        printf("表不存在");
        return (-1);
    }
    if (i < 1 || i > PL->length)
    {
        printf("删除位置不合法");
        return 0;
    }
    for (j = i; j < PL->length; j++)
        PL->data[j - 1] = PL->data[j];
    PL->length--;
    return 1;
    }

编译运行

  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
    /*
    顺序表的相关操作
     */
    //创建顺序表
    #include "stdio.h"
    #include "stdlib.h"
    #define MAXSIZE 10000
    typedef int DataType;

    //将 data 和 length 封装成一个结构体作为顺序表
    typedef struct node
    {
    DataType data[MAXSIZE];
    int length;
    } SeqList, *PSeqList;

    //顺序表的初始化
    PSeqList Init_SeqList(void)
    {
        PSeqList PL;
        PL = (PSeqList)malloc(sizeof(SeqList));
        if (PL)
            PL->length = 0;
       return PL;
    }

    //检索
    int Location_SeqList(PSeqList L, DataType x)
    {
        int i = 0;
        while (i < L->length && L->data[i] != x)
            i++;
        if (i >= L->length){
            printf("检索数据异常、n");
            return 0;
        }
        else
            return (i + 1);
    }

    //插入
    int Insert_SeqList(PSeqList PL, int i, DataType x)
    {
        int j;
        if (!PL)
    {
        printf("表不存在");
        return (-2);
    }
    if (PL->length >= MAXSIZE)
    {
        printf("表溢出");
        return (-1);
    }
    if (i < 1 || i > PL->length)
    {
        printf("插入位置异常");
        return 0;
    }
    for (j = PL->length - 1; j >= i - 1; j--)
        PL->data[j + 1] = PL->data[j];
    PL->data[i - 1] = x;
    PL->length++;
    return 1;
    }

    //删除
    int Delete_SeqList(PSeqList PL, int i)
    {
        int j;
        if (!PL)
        {
            printf("表不存在");
            return (-1);
        }
        if (i < 1 || i > PL->length)
        {
           printf("删除位置不合法");
            return 0;
        }
        for (j = i; j < PL->length; j++)
            PL->data[j - 1] = PL->data[j];
        PL->length--;
        return 1;
    }

    //主函数
    int main()
    {
        int m;
        int x;
        SeqList L;
        DataType DataType;
        Init_SeqList();     //初始化
        printf("在表中插入数据的个数:");
        scanf("%d",&m);
        for(int i=0;i<m;i++){
            printf("请输入第%d 个数据:",i+1);
            scanf("%d",&x);
            Insert_SeqList(&L,i+1,x);
        }
        printf("查询所有数据:\n");
        for(int i=0;L.data[i]!=NULL;i++){   //查询所有数据
            printf("%d,",L.data[i]);
        }printf("\b \n");
        printf("输入你想检索的数据:");
        scanf("%d",&m);
        if(Location_SeqList(&L,m))
        printf("元素%d 在表中的位置:%d\n",m,Location_SeqList(&L, m)); //检索位置
        printf("输入您想删除位置上的数据:");
        scanf("%d",&m);
        printf("删除表中位置为%d 的数据、n",m);
        Delete_SeqList(&L,m);           //删除数据
        printf("查询所有数据:\n");
        for(int i=0;L.data[i]!=NULL;i++){   //查询所有数据
            printf("%d,",L.data[i]);
        }printf("\b \n");
        return 0;
    }

应用——用顺序表解决约瑟夫问题

约瑟夫问题:人们站在一个等待被处决的圈子里。 计数从圆圈中的指定点开始,并沿指定方向围绕圆圈进行。 在跳过指定数量的人之后,执行下一个人。 对剩下的人重复该过程,从下一个人开始,朝同一方向跳过相同数量的人,直到只剩下一个人,并被释放。

函数:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
    int josephus_SeqList(PSeqList josephus_seq,int s,int m){
    int s1,i,w;
    if(!josephus_seq->length){
        printf("表中无元素、n");
        return 0;
    }   
    s1=s-1;                                             //data 数组中下标从零开始
    printf("长度:%d\n",josephus_seq->length);          //为什么生成长度是 18(vscode)、长度是 13(dev)
    printf("输出约瑟夫序列:\n");
    for(i=josephus_seq->length-8;i>0;i--){  
        s1=(s1+m-1)%i;                                  //找到列元素的下标
        // printf("s1=%d\ti=%d\n",s1,i);            
        w=josephus_seq->data[s1];                   
        printf("%d\t",w);                           
        Delete_SeqList(josephus_seq,s1+1);      //删除元素、s1+1 是指顺序表中数据的位置
    }
    return 1;
    }