数据结构-顺序表的基本操作

数据结构-顺序表的基本操作

编译器使用的是 VC++6.0

  • 创建和输出顺序表
  • 顺序表插入
  • 顺序表查询
  • 顺序表删除
  • 顺序表排序
  • 顺序表有序插入
  • 删除X到Y之间的元素

#include "stdio.h"

#define listSize 20 //默认表容量20
typedef int List;

typedef struct {
    List data[listSize];    //数组data用于存放表节点
    int length;    //表节点的长度(节点数)
} SeqList;

//输出顺序表 OK
void printList(SeqList *list, int n) {
    int i;
    printf("The list is: ");
    for (i = 0; i < n; i++) {
        printf("%4d", list->data[i]);
    }
}

//新建顺序表和显示 OK
void createAndShowList(SeqList *list, int n) {
    int i;
    printf("Please input elements(CreateAndShow): ");
    list->length = n;
    for (i = 0; i < n; i++) {
        scanf("%d", &list->data[i]);
    }
    printList(list, n);
}

//查找元素 OK
int selectElem(SeqList *list, List selectNum) {
    int i;
    for (i = 0; i < (*list).length - 1; i++) {
        if ((*list).data[i] == selectNum) {
            return i + 1;
        }
    }
    return -1;
}

//插入元素 OK
void insertElem(SeqList *list, List num, int position) {
    int flag,i;
    if ((*list).length > listSize) {
        printf("溢出\n");
    } else if ((position < 1) || (position > (*list).length + 1)) {
        printf("位置有误\n");
    } else {
        flag = (*list).data[position - 1];
        for (i = (*list).length - 1; i >= position - 1; i--) {
            (*list).data[i + 1] = (*list).data[i];
        }
        list->data[position] = flag;
        list->data[position - 1] = num;
        (*list).length += 1;

        printList(list, list->length);
    }
}

//删除元素 OK
void deleteElem(SeqList *list, int position) {
    int i;
    if (position > listSize) {
        printf("Out of Bounds");
    } else if (position < 1 || position > (*list).length) {
        printf("The position is null");
    } else {
        for (i = position - 1; i < (*list).length; i++) {
            (*list).data[i] = (*list).data[i + 1];
        }
        (*list).length--;
        printList(list, list->length);
    }
}

//简单排序 OK
void sortList(SeqList *list) {
    int temp;
    int compare = 0, move = 0;
    int i,j;
    for (i = 0; i < list->length - 1; i++) {
        for (j = i + 1; j < list->length; j++) {
            compare++;
            if (list->data[i] > list->data[j]) {
                temp = list->data[i];
                list->data[i] = list->data[j];
                list->data[j] = temp;
                move++;
            }
        }
    }
    printf("Compared Count:%d,Move Count:%d.\n", compare, move);
    printList(list, list->length);
}

//快速排序 OK
void quickSort(SeqList *list, int l, int r) {
    if (l < r) {
        int i = l, j = r, x = list->data[l];
        while (i < j) {
            while (i < j && list->data[j] >= x) // 从右向左找第一个小于x的数
                j--;
            if (i < j)
                list->data[i++] = list->data[j];
            while (i < j && list->data[i] < x) // 从左向右找第一个大于等于x的数
                i++;
            if (i < j)
                list->data[j--] = list->data[i];
        }
        list->data[i] = x;
        quickSort(list, l, i - 1); // 递归调用
        quickSort(list, i + 1, r);
    }
}

//按顺序插入元素 OK
void insertElementAsSort(SeqList *list, List num) {
    int maxIndex = (*list).length - 1;
    int max = (*list).data[maxIndex];
    int min = (*list).data[0];
    int i,j,flag;
    if (num < min) {
        for (i = (*list).length - 1; i >= 0; i--) {
            (*list).data[i + 1] = (*list).data[i];
        }
        (*list).data[0] = num;

    } else if (num > max) {
        (*list).data[maxIndex + 1] = num;
    } else {
        for (i = 1; i < (*list).length - 2; i++) {
            if (num < (*list).data[i]) {
                flag = (*list).data[i];
                for (j = (*list).length - 1; j > i; j--) {
                    (*list).data[j + 1] = (*list).data[j];
                }
                (*list).data[i] = num;
                (*list).data[i + 1] = flag;
                break;
            }
        }
    }
    (*list).length += 1;
    printList(list, list->length);
}

//删除X-Y之间的元素 OK
void deleteXtoY(SeqList *list, List start, List end) {
    int maxIndex = (*list).length - 1;
    int max = (*list).data[maxIndex];
    int min = (*list).data[0];
    int i,j = 0;
    if ((start < min) && (end > max)) {
        list->length = 0;
    } else {
        for (i = 0; i < list->length; i++) {
            if (!(list->data[i] > start && list->data[i] < end))
                list->data[j++] = list->data[i];
        }
        list->length = j;
    }
    printList(list, list->length);
}

void main() {

    /*创建初始化顺序表,并打印输出*/
    SeqList list;   //顺序表
    int n;  //顺序表长度
    List insertNum;
    int position;
    List selectNum;
    int index;
    int positionDel;
    int s;
    int insertElement;
    int i;
    List startDel, endDel;

    printf("Please input the length of list: ");
    scanf("%d", &n);
    createAndShowList(&list, n);

    /*在顺序表指定位置插入元素*/

    printf("\nPlease input the position and element that you want to insert: ");
    scanf("%d %d", &position, &insertNum);
    insertElem(&list, insertNum, position);

    /*在顺序表中查找给定值的位置,并输出比较次数*/

    printf("\nPlease input the element that you want to select: ");
    scanf("%d", &selectNum);
    index = selectElem(&list, selectNum);
    printf("The position is %d, The count is %d.", index, index);

    /*删除顺序表中指定位置的元素*/

    printf("\nPlease input the position which you want to delete: ");
    scanf("%d", &positionDel);
    deleteElem(&list, positionDel);

    /*顺序表排序*/

    printf("\nPlease choice 1.(SimpleSort) or 2.(QuickSort) ?: ");
    scanf("%d", &s);
    switch (s) {
    case 1:
        printf("\nSimpleSort list: ");
        sortList(&list);
        break;
    case 2:
        quickSort(&list, 0, list.length - 1);
        printf("\nQuickSort list: ");
        for (i = 0; i < n; i++) {
            printf("%4d", list.data[i]);
        }
        break;
    default:
        printf("Input ERROR");
        break;
    }

    /*顺序表按顺序插入元素*/

    printf("\nPlease input the element what you want to insert: ");
    scanf("%d", &insertElement);
    insertElementAsSort(&list, insertElement);

    /*快速删除x-y之间的元素*/

    printf("\nPlease input the delete position of start and end: ");
    scanf("%d %d", &startDel, &endDel);
    deleteXtoY(&list, startDel, endDel);
    printf("\n");
}

猜你喜欢

转载自blog.csdn.net/ming2316780/article/details/73801076