顺序表的基本操作-完整代码和拆开分析

#include<stdio.h>    //增+删+改+初始化+输出
#include<stdlib.h>
#define MaxSize 10   此数决定了后面插入数据的多少,超过该数字输出顺序表的时候不是正确的数
typedef int ElementType;
struct SqList {
    ElementType elem[MaxSize];
    int Length;
};

typedef struct  SqList *PtrNode;
typedef PtrNode List;

List InitList();
int InSert(List L, int i, ElementType x) ;
int Delete(List L, int i);
int GetElem(List L, int i);
int Print(List L);

int main() {
    int a;
    ElementType x;
    List list;
    list=InitList();
    InSert(list, 1, 1);
    InSert(list, 2, 2);
    InSert(list, 3, 3);
    Print(list);
    printf("第一处的元素为:%d
",GetElem(list,1));
    printf("要删除第几处的数据");
    scanf("%d", &a);
    Delete(list, a);
    Print(list);
}
List InitList() {  //初始化
    List L;
    L = (List)malloc(sizeof(struct SqList));
    L->Length = 0;
    printf("初始化成功
");
    return L;
}
//插入
int InSert(List L, int i, ElementType x) {
    int j;
    if (i<1 || i>L->Length + 1) {
        printf("越界"); return 0;
    }
    for (j = L->Length; j >= i; j--) {
        L->elem[j] = L->elem[j-1];   L—>elem[j+1]=L->elem[j];是错误的,j是数组长度,用作数组索引时要小心,所以上面的条件不应该是j>i
    }
    L->elem[i - 1] = x;  //第i处,因为是数组所以减一
    L->Length++;
    return 1;
}
//删除
int Delete(List L, int i) {
    int j;
    if (i<1 || i>L->Length) {
        printf("越界"); return 0;
    }
    for (j = i - 1; j < L->Length-1; j++)
        L->elem[j] = L->elem[j+1];
    L->Length--;
    return 1;

}
//查找第i处的数据
int GetElem(List L, int i) {
    if (i<1 || i>L->Length) {
        printf("越界"); return 0;
    }
    return L->elem[i - 1];
}
//遍历输出
int Print(List L) {
    int i = 0;
    for (i; i < L->Length; i++)
        printf("%d
", L->elem[i]);
}

1. 初始化:

List InitList() {  //初始化
     List L;
     L = (List)malloc(sizeof(struct SqList));
     L->Length = 0;
     printf("初始化成功
");
     return L;
 }

(1)malloc开辟空间,L指向该空间

(2)空间的Length属性赋值为零;

 

2.插入:

int InSert(List L, int i, ElementType x) { 
43     int j;
44     if (i<1 || i>L->Length + 1) {
45         printf("越界"); return 0;
46     }
47     for (j = L->Length; j > i; j--) {
48         L->elem[j + 1] = L->elem[j];
49     }此处错误,修改见上面完整代码
50     L->elem[i - 1] = x;  //第i处,因为是数组所以减一
51     L->Length++;
52     return 1;
53 }

(1)判断输入的待插入位置是否合理------要插入的位置是否小于1,或者大于顺序表的长度Length+1【与其他的不同:可以在Length+1位置插入】

(2)如果不满足(1),则循环赋值------从顺序表最后一个位置开始,从后向前依次将前一个位置的值赋给后一个位置

(3)插入待插入数x-------将x赋值给待插入位置

(4)顺序表长度加一

3.删除:

 

int Delete(List L, int i) {
56     int j;
57     if (i<1 || i>L->Length) {
58         printf("越界"); return 0;
59     }
60     for (j = i - 1; j < L->Length-1; j++)
61         L->elem[j] = L->elem[j+1];
62     L->Length--;
63     return 1;
64 
65 }

 

(1)判断输入的待插入位置是否合理------要插入的位置是否小于1,或者超出顺序表的长度Length

(2)如果不满足(1),则循环赋值-------从待删除位置开始,从前向后依次将后一个位置的值赋值给前一个位置

(3)顺序表长度减一

4.查找:

 

67 int GetElem(List L, int i) {
68     if (i<1 || i>L->Length) {
69         printf("越界"); return 0;
70     }
71     return L->elem[i - 1];
72 }

 

(1)判断输入的待插入位置是否合理------要插入的位置是否小于1,或者超出顺序表的长度Length

(2)直接根据数组下标返回该值

5.输出:

74 int Print(List L) {
75     int i = 0;
76     for (i; i < L->Length; i++)
77         printf("%d
", L->elem[i]);
78 }

根据数组下标直接循环输出

**********************************************

Tips:初始化和查找必须有返回值(初始化要将创建的顺序表名返回;查找要将找到的值返回),其他函数可以不设返回值或者返回1

你可能感兴趣的