typedef int DataType; //数据类型 typedef struct{ //元素结构体 DataType *data; //存的数据 int maxSize, n; //表的最大容量和数据长度 }SeqList;
接下来给出主要两个操作方法增加和删除元素的实现
1、增加
主要思路:插入一个元素时,需要要指定插入的表是哪个,位置在哪,元素是什么。也就是传入的参数
a、首先判断要插入的位置是否正确,必须大于或等于1(假设我们把第一个元素的位置叫做1号位置),同时要插入的位置必须小于表的长度,而且要顺序插入,就是必须要连续的不能,第一个有,第二个空,第三个又有。
b、如果这时表满了,我们就要分配更多的空间给表(我这里是又分配了100个空间),同时要记得把表容量加上。
c、重要的来了,我们怎么插入一个元素,而且还要保证后面的元素呢?很简单,找出要插入的位置把这个位置,包括这个位置的元素全部向后移动一个位置,然后吧我们要的元素放入i这个位置。
图示:
假设原来有 :
a b c d e f
现在有一个x元素要插入到b的位置也就是2号位置x
这时先把a后所有的元素向后移动a b cd e f
a () b c d e f
然后吧x放到2号位置
a (x) b c d e f
int insert(SeqList *L, int i, DataType x) { DataType *newspace; if (i > L->n + 1 || i < 1) //判断位置是否正确 { printf("插入位子不对\n"); return 0; } if (L->n >= L->maxSize) //如果空间不够再分配100个 { newspace = (DataType *)realloc(L->data, 100 * sizeof(DataType)); L->data = newspace; L->maxSize += 100; } for (int k = (i-1); k < L->n; k++) //循环向后插入 { L->data[L->n] = L->data[L->n - 1]; L->n--; } L->data[i - 1] = x; L->n++; return 1; }2、删除
主要思路:和增加差不多,这里我就简单描述一下
a、找出要删除的元素,判断元素和位置是否匹配
b、把要删除的元素之后的元素全部向前移动一个位置,就好了
int reMove(SeqList *L, int i, DataType x) { int tmp = *(L->data + i-1); //备份指针 if (tmp != x) //如果位子和元素对应不上就错误 { printf("请输入正确的元素\n"); return 0; } for (int k = i - 1; k <= L->n - 1; k++) //循环向前插入 { L->data[k] = L->data[k + 1]; } L->n--; return 1; }备注:当要对指针操作时候必须要备份指针,防止对指针的操作影响后面的指针找不到准缺的位置
最后给出全部代码:
/* 作者:何翔宇 时间:2014年12月3日 坐标:黑龙江齐齐哈尔大学 功能:顺序表的增加,删除等 编译环境:vs2013社区版 系统:Windows7 */ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <malloc.h> #include <stdlib.h> #define initSize 100 //初始化表大小 typedef int DataType; //数据类型 typedef struct{ //元素结构体 DataType *data; //存的数据 int maxSize, n; //表的最大容量和数据长度 }SeqList; void initList(SeqList *L); //初始化表 int insert(SeqList *L, int i, DataType x); //插入一个数据,i是位置,x是数据 void output(SeqList *L); //输出表 int isFull(SeqList *L); //判断表是否满 int isEmpty(SeqList *L); //判断是否为空 int getLength(SeqList *L); //得到表长度 int getElem(SeqList *L, DataType x); //获得元素位子 int reMove(SeqList *L, int i, DataType x); //删除一个元素,i是位置,下是数据 void printMsg(); //打印信息 int getOption(); //获取用户操作 void main() { int op,i,x; SeqList L; initList(&L); printMsg(); while (op = getOption()) { switch (op) { case '1': printf("请输入位置和元素\n"); scanf("%d %d", &i,&x); _flushall(); insert(&L, i, x); printf("插入元素%d", x); break; case '2': printf("请输入位置和元素\n"); scanf("%d %d", &i, &x); _flushall(); reMove(&L, i, x); printf("删除元素%d\n", x); break; case '3': printf("请输入元素\n"); scanf("%d", &x); _flushall(); printf("%d", getElem(&L, x)); break; case '4': output(&L); break; case '5': printf("%d", isFull(&L)); break; case '6': printf("%d", isEmpty(&L)); break; case '7': printf("%d", getLength(&L)); break; case '8': printf("---byebye----"); return; break; default: break; } printf("\n>> "); } return; } void initList(SeqList *L) { L->data = (DataType *)malloc(100 * sizeof(DataType)); //初始化先分配100个空间 if (!L->data) //判断是否分配成功 { printf("分配错误\n"); return; } L->maxSize = initSize; //分配大小 L->n = 0; } int insert(SeqList *L, int i, DataType x) { DataType *newspace; if (i > L->n + 1 || i < 1) //判断位置是否正确 { printf("插入位子不对\n"); return 0; } if (L->n >= L->maxSize) //如果空间不够再分配100个 { newspace = (DataType *)realloc(L->data, 100 * sizeof(DataType)); L->data = newspace; L->maxSize += 100; } for (int k = (i-1); k < L->n; k++) //循环向后插入 { L->data[L->n] = L->data[L->n - 1]; L->n--; } L->data[i - 1] = x; L->n++; return 1; } int isFull(SeqList *L) { return (L->n == L->maxSize) ? 1 : 0; } int isEmpty(SeqList *L) { return (L->n == 0) ? 1 : 0; } int getLength(SeqList *L) { return L->n; } void output(SeqList *L) { DataType *temp = L->data; //当对指针操作时候必须对指针进行拷贝 for (int i = 0; i < L->n; i++) { printf("%d",*(temp++)); } printf("\n"); } int getElem(SeqList *L, DataType x) { DataType *temp = L->data; for (int i = 0; i < L->n; i++) { if (*(temp++) == x) { return i; } } return -1; } int reMove(SeqList *L, int i, DataType x) { int tmp = *(L->data + i-1); //备份指针 if (tmp != x) //如果位子和元素对应不上就错误 { printf("请输入正确的元素\n"); return 0; } for (int k = i - 1; k <= L->n - 1; k++) //循环向前插入 { L->data[k] = L->data[k + 1]; } L->n--; return 1; } void printMsg() { printf("1、插入一个数据\n"); printf("2、删除一个数据\n"); printf("3、获得一个元素位子\n"); printf("4、查看所有数据\n"); printf("5、查看表是否为满\n"); printf("6、查看表是否为空\n"); printf("7、查看表长度\n"); printf("8、退出\n"); printf(">> "); } int getOption() {//获取用户输入操作 char input; scanf("%c", &input); _flushall(); //fflush(stdin); //input=toupper(input); return input; }
真是的 一贴代码注释都不整齐了 纠结啊