数据结构--顺序表的实现

来源:互联网 发布:推荐个苹果下载软件 编辑:程序博客网 时间:2024/06/05 16:24
#include <stdio.h>#include <stdbool.h>#include <stdlib.h>typedef int ElementType;typedef struct Node *Sequence_list;struct Node{//***********************int m_capacity;     //数组的最大容量        *int m_size;//数组当前存储元素的个数*ElementType *array; //存放元素的数组*};//***********************Sequence_list Create(){int capacity, size;Sequence_list list;printf("数组容量: ");scanf("%d", &capacity);  //*******************list = malloc(sizeof(struct Node));                   //为结构体分配内存  *list->array = malloc(sizeof(ElementType) * capacity); //为数组分配内存    *list->m_capacity = capacity;  //储存数组的最大容量*   //*******************printf("输入初始化表的元素个数:");scanf("%d", &size);while (size > list->m_capacity) {printf("超过初始化数组的容量,重新输入:");scanf("%d", &size);}list->m_size = size;  //数组已经存储的元素个数for (int i = 0; i != size; i++) {printf("第%d个元素的值: ", i + 1);scanf("%d", &list->array[i]);}return list;}//按值查找元素int Find(Sequence_list list, ElementType element){int i = 0;if (list == NULL) { //检查顺序表是否已经初始化printf("顺序表未初始化\n");return -1;}//list->m_size表示最后一个元素的下标while (i != list->m_size - 1 && element != list->array[i])++i;if (element == list->array[i])return i;return -1;}/************************************************** *要插入一个元素,首先要检查数组是否还有空余的位置* *如果有,就把插入位置的元素以及其后面的元素全部向* *右动一个位置,为新的元素空出一个位置,然后插入  * **************************************************/void Insert(Sequence_list list, ElementType element, int position){if (list == NULL) {printf("顺序表未初始化\n");return;}if (list->m_size == list->m_capacity){ //检查是否有空余的位置printf("顺序表已满\n");return;}   //****************************************if (position < 1 || position > list->m_capacity) { //检查位置的合法性,因为数组的下标从0开始*printf("位置不合法\n");   //在插入的时候需要将位置减1才能得到插入 *return;   //位置的下标*}   //****************************************for (int i = list->m_size - 1; i >= position - 1; i--) //将元素向右移动一个位置list->array[i+1] = list->array[i];list->array[position-1] = element;//插入元素++list->m_size;//更新当前元素个数}/*********************************************** * 和插入元素的操作类似,首先要先检查是否是空表* * 而且还要检查位置的合法性。然后将要删除的元素* * 之后的元素全部向左移动一个位置,覆盖掉要删除* * 的元素,然后更新当前数组的元素个数   * ***********************************************/void Remove(Sequence_list list, int position){if (list == NULL) {printf("顺序表未初始化\n");return;}if (!list->m_size){printf("空表\n");return;}if (position < 1 || position > list->m_size) {printf("位置不合法\n");return;}    //注意是从position开始移动,因为这个位置是要删除元素的下一个元素for (int i = position; i <= list->m_size - 1; i++) //移动元素,覆盖掉要删除的元素list->array[i-1] = list->array[i];--list->m_size; //更新当前数组的元素个数}void Print(Sequence_list list) {if (list == NULL) {printf("顺序表未初始化\n");return;}for (int i = 0; i != list->m_size; i++)printf("%d ", list->array[i]);printf("\n");}//测试代码int main(void){Sequence_list list = NULL;int option, position;while (true){printf("1.创建顺序表\n2.按值查找元素\n3.插入元素\n4.删除元素\n5.输出全部元素\n");printf("选择:");while (scanf("%d", &option) != 1) {getchar();printf("错误,重新选择: ");}switch (option){case 1: list = Create();break;case 2: printf("查找的元素值:");scanf("%d", &option);if (Find(list, option) != -1)printf("元素存在\n");elseprintf("元素不存在\n");break;case 3: printf("输入插入的元素和位置:");scanf("%d %d", &option, &position);Insert(list, option, position);break;case 4: printf("输入要删除元素的位置:");scanf("%d", &position);Remove(list, position);break;case 5: Print(list);break;}}return 0;}

原创粉丝点击