赞
踩
需要完成的功能:
1.建立一个长度为N的顺序表。
2.输出该顺序表的各个元素以及相应的下标。
3.在顺序表的第i个位置里插入元素x,并且输出插入元素后顺序表中各个元素以及相应的下标。
4.删除顺序标中第i个位置的元素,并且输出删除元素后顺序表中各个元素以及相应的下标。
5.在顺序表中找到x元素,并且返回该元素的位置,如果没有找到该元素x,则输出“顺序表中没有该元素”。
6.输出该顺序标中的最大值m和次最大值n。
7.初始化(清空)该顺序表中的所有元素。
1、程序所包含的头文件和定义。
#include<stdio.h>
#include<stdlib.h> //包含了创建顺序表所需的malloc()函数和realloc()函数
typedef int ElemType; //自定义int类型变量的别名ElemType
#define MAXSIZE 100 //表的最大长度
typedef struct { //定义顺序表的结构体变量
ElemType *data; //数据域
int length; //存储目前表的长度
int initsize; //表的容量
}sqlist;
2、顺序表的建立。
void InitList(sqlist* L, int size) {
L->data = (ElemType*)malloc(size * sizeof(ElemType));
L->length = 0;
L->initsize = size;
}
3、顺序表数据的输出。
void PrintList(sqlist* L) {
int i;
printf("顺序表中的元素及相应下标:\n");
for (i = 0; i < L->length; i++) {
printf("下标:%d,元素:%d\n", i, L->data[i]);
}
}
4、插入操作。
void InsertList(sqlist* L, int i, ElemType x) { int j; if (i < 0 || i > L->length) { printf("插入位置错误!\n"); return; } if (L->length >= L->initsize) { ElemType* newdata = (ElemType*)realloc(L->data, (L->initsize + MAXSIZE) * sizeof(ElemType)); if (newdata == NULL) { printf("内存分配失败!\n"); return; } L->data = newdata; L->initsize += MAXSIZE; } for (j = L->length; j > i; j--) { L->data[j] = L->data[j - 1]; } L->data[i] = x; L->length++; }
5、删除元素操作。
void DeleteList(sqlist* L, int i) {
int j;
if (i < 0 || i >= L->length) {
printf("删除位置错误!\n");
return;
}
for (j = i; j < L->length - 1; j++) {
L->data[j] = L->data[j + 1];
}
L->length--;
}
6、查找元素。
int SearchList(sqlist* L, ElemType x) {
int i;
for (i = 0; i < L->length; i++) {
if (L->data[i] == x) {
return i;
}
}
return -1;
}
7、输出最大值和次最大值。
void FindMax(sqlist* L) { int max = L->data[0]; int second_max = L->data[0]; int i; for (i = 1; i < L->length; i++) { //找出最大值赋值给max前先把max保存到次最大值中 if (L->data[i] > max) { second_max = max; max = L->data[i]; } //若当前数值不是最大值也要判断一下当前值是否比次最大值大 else if (L->data[i] > second_max && L->data[i] < max) { //找出次最大值 second_max = L->data[i]; } } printf("最大值:%d,次最大值:%d\n", max, second_max); }
8、清空顺序表。(逻辑上的清空)
void ClearList(sqlist* L) { //清表
L->length = 0;
}
9、主函数。
int main() { sqlist List; int N, i=-100, x=-100, index,y; char c; printf("请输入顺序表的长度(N):"); scanf_s("%d", &N); InitList(&List, N); printf("请输入顺序表的元素:\n"); for (i = 0; i < N; i++) { scanf_s("%d", &List.data[i]); List.length++; } while ((c = getchar()) != '\n' && c != EOF) {} //简单的菜单界面 printf("------------***************------------\n"); printf("输入下面数字分别进行不同的操作!\n"); printf("1:输出顺序表元素及其下标\n"); printf("2:插入元素\n"); printf("3:删除元素\n"); printf("4:查找元素\n"); printf("5:输出元素最大值和次最大值\n"); printf("6:清空顺序表\n"); printf("0:退出程序\n"); do { scanf_s("%d", &y); switch (y) { case 1: PrintList(&List); break; case 2: printf("请输入要插入的位置和元素(i, x):"); scanf_s("%d,%d", &i, &x); //判断数据是否成功输入 //-100的目的只是判断i和x的值是否读取成功,可以改为别的。 if (i == -100 || x == -100) { printf("输入有误!\n"); { printf("------------***************------------\n"); printf("输入下面数字分别进行不同的操作!\n"); printf("1:输出顺序表元素及其下标\n"); printf("2:插入元素\n"); printf("3:删除元素\n"); printf("4:查找元素\n"); printf("5:输出元素最大值和次最大值\n"); printf("6:清空顺序表\n"); printf("0:退出程序\n"); } /*读取缓冲区中的数据,防止对后面数据进行干扰,其实可以省略*/ while ((c = getchar()) != '\n' && c != EOF) {} break; } InsertList(&List, i, x); PrintList(&List); break; case 3: printf("请输入要删除的位置(i):"); scanf_s("%d", &i); DeleteList(&List, i); PrintList(&List); break; case 4: printf("请输入要查找的元素(x):"); scanf_s("%d", &x); index = SearchList(&List, x); if (index != -1) { printf("元素 %d 在顺序表中的位置为:%d\n", x, index); } else { printf("顺序表中没有该元素!\n"); } break; case 5: FindMax(&List); break; case 6: ClearList(&List); printf("清空后的顺序表:\n"); PrintList(&List); free(List.data); break; default: y = 0; } } while (y); return 0; }
从这次实验中我对顺序表的操作有了更深层次的了解,顺序表的实现相对简单,主要涉及到数组的初始化、插入、删除、查找等操作。在插入和删除元素时,需要注意元素的移动和顺序的调整,以保持顺序表的有序性。
顺序表的空间是固定的,如果要增加空间,就必须先申请出空间。相对于链表来说,顺序表的优点是可以快速访问任意位置的元素,缺点就是不够灵活,如果需要大量迁移数据的话,会导致效率降低。
#include<stdio.h> #include<stdlib.h> typedef int elemtype; #define maxsize 100 typedef struct { elemtype* data; int length; int initsize; } sqlist; //新建表 void initlist(sqlist* l, int size) { l->data = (elemtype*)malloc(size * sizeof(elemtype)); l->length = 0; l->initsize = size; } //输出表中的数据及其下标 void printlist(sqlist* l) { int i; printf("顺序表中的元素及相应下标:\n"); for (i = 0; i < l->length; i++) { printf("下标:%d,元素:%d\n", i, l->data[i]); } } //插入 void insertlist(sqlist* l, int i, elemtype x) { int j; if (i < 0 || i > l->length) { printf("插入位置错误!\n"); return; } if (l->length >= l->initsize) { elemtype* newdata = (elemtype*)realloc(l->data, (l->initsize + maxsize) * sizeof(elemtype)); if (newdata == null) { printf("内存分配失败!\n"); return; } l->data = newdata; l->initsize += maxsize; } for (j = l->length; j > i; j--) { l->data[j] = l->data[j - 1]; } l->data[i] = x; l->length++; } //删除元素 void deletelist(sqlist* l, int i) { int j; if (i < 0 || i >= l->length) { printf("删除位置错误!\n"); return; } for (j = i; j < l->length - 1; j++) { l->data[j] = l->data[j + 1]; } l->length--; } //查找元素 返回位置 int searchlist(sqlist* l, elemtype x) { int i; for (i = 0; i < l->length; i++) { if (l->data[i] == x) { return i; } } return -1; } //找最大值和次最大值 void findmax(sqlist* l) { int max = l->data[0]; int second_max = l->data[0]; int i; for (i = 1; i < l->length; i++) { if (l->data[i] > max) { second_max = max; max = l->data[i]; } else if (l->data[i] > second_max && l->data[i] < max) { //找出次最大值 second_max = l->data[i]; } } printf("最大值:%d,次最大值:%d\n", max, second_max); } void clearlist(sqlist* l) { //清表 l->length = 0; } int main() { sqlist list; int n, i=-100, x=-100, index,y; char c; printf("请输入顺序表的长度(n):"); scanf_s("%d", &n); initlist(&list, n); printf("请输入顺序表的元素:\n"); for (i = 0; i < n; i++) { scanf_s("%d", &list.data[i]); list.length++; } while ((c = getchar()) != '\n' && c != EOF) {} printf("------------***************------------\n"); printf("输入下面数字分别进行不同的操作!\n"); printf("1:输出顺序表元素及其下标\n"); printf("2:插入元素\n"); printf("3:删除元素\n"); printf("4:查找元素\n"); printf("5:输出元素最大值和次最大值\n"); printf("6:清空顺序表\n"); printf("0:退出程序\n"); do { scanf_s("%d", &y); switch (y) { case 1: printlist(&list); break; case 2: printf("请输入要插入的位置和元素(i, x):"); scanf_s("%d,%d", &i, &x); if (i == -100 || x == -100) { printf("输入有误!\n"); { printf("------------***************------------\n"); printf("输入下面数字分别进行不同的操作!\n"); printf("1:输出顺序表元素及其下标\n"); printf("2:插入元素\n"); printf("3:删除元素\n"); printf("4:查找元素\n"); printf("5:输出元素最大值和次最大值\n"); printf("6:清空顺序表\n"); printf("0:退出程序\n"); } //读取缓冲区中的数据,防止对后面数据进行干扰 while ((c = getchar()) != '\n' && c != eof) {} break; } insertlist(&list, i, x); printlist(&list); break; case 3: printf("请输入要删除的位置(i):"); scanf_s("%d", &i); deletelist(&list, i); printlist(&list); break; case 4: printf("请输入要查找的元素(x):"); scanf_s("%d", &x); index = searchlist(&list, x); if (index != -1) { printf("元素 %d 在顺序表中的位置为:%d\n", x, index); } else { printf("顺序表中没有该元素!\n"); } break; case 5: findmax(&list); break; case 6: clearlist(&list); printf("清空后的顺序表:\n"); printlist(&list); free(list.data); default: y = 0; break; } } while (y); return 0; }
需要注意的是我这里用的是scanf_s,有些编译器需要把_s去掉
即scanf。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。