#include<stdio.h>
#include <stdlib.h>
#include<malloc.h>
#define InitSize 100//表的初始长度定义
typedef struct{
int *data;
int MaxSize,length;
}SeqList;
//初始化动态顺序表
void InitList(SeqList &L){
L.data=(int*)malloc(sizeof(int)*InitSize);
L.MaxSize=InitSize;
L.length=0;
printf("初始化动态顺序表成功!");
}
//创建动态态顺序表
void CreateList(SeqList &L) {
int num;
printf("请输入要往顺序表中加入的整数(输入9999退出):");
while(scanf("%d", &num) == 1 && num != 9999 && L.length < L.MaxSize)
{
L.data[L.length++] = num;
printf("顺序表的长度是:%d\n", L.length);
printf("剩余位置的数量:%d\n", L.MaxSize - L.length);
printf("请输入要往顺序表中加入的整数(输入9999退出):");
}
}
//初始化动态顺序表
void TravelList(SeqList &L){
for(int i=0;i<L.length;i++){
printf("%d ",L.data[i]);
}
printf("\n");
}
//求表长
void length(SeqList L){
printf("%d\n",L.length);
}
//按值查找操作
void Locate(SeqList L,int e){
int count=0;
for(int i=0;i<L.length;i++){
if(L.data[i]==e){
printf("%d出现在顺序表的第%d个位置!\n",e,(i+1));
count+=1;
}
}
if(count==0)
printf("在顺序表中没有找到元素%d\n",e);
}
//按位查找操作
int GetElem(SeqList L,int i){
if(i<0||i>L.length)
return -1;
else
return L.data[i-1];
}
//插入操作(在L中的第i个位置插入指定元素e)
void ListInsert(SeqList &L,int i,int e){
if(i<=0||i>L.length+1){
printf("插入的位置不合法!");
return;
}
for(int j=L.length;j>=i;j--)
L.data[j]=L.data[j-1];
L.data[i-1]=e;//思路简单记忆:先从后往前往后挪,直到要插入位置的下一个位置,然后赋值该位置
L.length++;
}
//删除操作删除表L中第i个位置的元素,并且用e返回删除元素的值
bool ListDelete(SeqList &L,int i,int &e){
if(i<=0||i>L.length){
return 0;
}
e=L.data[i-1];
for(int j=i;j<L.length;j++){
L.data[j-1]=L.data[j];
}//思路简记:先把值赋给e然后从前往后往前挪
L.length-=1;
return 1;
}
//判断动态顺序表是否空
bool Empty(SeqList L){
if(L.length)
return 1;
else
return 0;
}
//销毁动态顺序表
void Destory(SeqList &L){
free(L.data);
// 将指针设为NULL,防止悬挂指针
L.data = NULL;
// 可以选择将MaxSize和length设为0,但这不是必须的,因为结构体的内存已经被释放
L.MaxSize = 0;
L.length = 0;
printf("销毁动态顺序表成功!");
}
int main()
{
SeqList L;
int choice;
do {
printf("\n请选择操作:\n");
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("9. 判空\n");
printf("10.销毁表\n");
printf("11. 退出\n");
scanf("%d",&choice);
switch (choice) {
case 1:{
InitList(L);
break;
}
case 2:{
CreateList(L);
break;
}
case 3:{
printf("遍历顺序表得到的结果是:");
TravelList(L);
break;
}
case 4:{
printf("当前的表长是:");
length(L);
break;
}
case 5:{
int e;
printf("按值查找请输入:");
scanf("%d", &e);
Locate(L, e);
break;
}
case 6: {
int i;
printf("按位查找请输入:");
scanf("%d",&i);
printf("顺序表中第%d个元素是%d(如果是-1代表没找到)",i,GetElem(L,i));
break;
}
case 7: {
int i,e;
printf("请输入要插入元素的位置:");
scanf("%d",&i);
printf("请输入要插入元素值:");
scanf("%d",&e);
ListInsert(L,i,e);
printf("插入后的顺序表是:");
TravelList(L);
printf("插入后的顺序表的表长是:");
length(L);
break;
}
case 8:{
int i,e;
printf("请输入要删除元素的位置:");
scanf("%d",&i);
if(ListDelete(L,i,e)){
printf("删除第%d个位置的元素成功!\n",i);
printf("删除的元素是:%d/n",e);
printf("删除后的顺序表是:");
TravelList(L);
printf("删除后的顺序表的表长是:");
length(L);
}
else
printf("输入的删除位置不合法!");
break;
}
case 9:{
if(Empty(L))
printf("静态顺序表非空!");
else
printf("静态顺序表空了!");
break;
}
case 10:{
Destory(L);
break;
}
case 11:
printf("程序退出。\n");
break;
default:
printf("无效的选择,请重新输入。\n");
}
} while(choice!=11);
return 0;
}
2025王道考研13页2.1.2参考代码(动态数组版本)
最新推荐文章于 2024-11-11 16:10:40 发布