#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <windows.h>
typedef int DataType;
//定义结构体
typedef struct
{
DataType *list;
int maxLen;
int length;
}SeqList;
void listInitiate(SeqList *L, int max);
int insert(SeqList *L, int pos, DataType d);
void getList(SeqList *L, int pos, DataType *x);
int listLength(SeqList *L);
int deleteList(SeqList *L, int pos, DataType *x);
void destroy(SeqList *L);
void menu();
#include <malloc.h>
#include <stdlib.h>
#include <windows.h>
typedef int DataType;
//定义结构体
typedef struct
{
DataType *list;
int maxLen;
int length;
}SeqList;
void listInitiate(SeqList *L, int max);
int insert(SeqList *L, int pos, DataType d);
void getList(SeqList *L, int pos, DataType *x);
int listLength(SeqList *L);
int deleteList(SeqList *L, int pos, DataType *x);
void destroy(SeqList *L);
void menu();
int main()
{
SeqList L;
DataType *data, x;
int maxLen, i, j = 0, choose, pos;
printf("请在键盘上输入动态顺序表预定的最大值maxLen: ");
scanf("%d", &maxLen);
printf("\n");
data = (DataType *)malloc(maxLen * sizeof(DataType));
printf("请在键盘上输入任意个数存入动态顺序表的数据:\n");
while(1 == scanf("%d", &data[j]))//可接受未知长度的数据元素
{
j++;
}
printf("预定的maxLen为: %d, 存入的数据元素个数为:%d,分别为:", maxLen, j);
for(i = 0; i < j; ++i) printf("%d ", data[i]);
printf("\n");
{
SeqList L;
DataType *data, x;
int maxLen, i, j = 0, choose, pos;
printf("请在键盘上输入动态顺序表预定的最大值maxLen: ");
scanf("%d", &maxLen);
printf("\n");
data = (DataType *)malloc(maxLen * sizeof(DataType));
printf("请在键盘上输入任意个数存入动态顺序表的数据:\n");
while(1 == scanf("%d", &data[j]))//可接受未知长度的数据元素
{
j++;
}
printf("预定的maxLen为: %d, 存入的数据元素个数为:%d,分别为:", maxLen, j);
for(i = 0; i < j; ++i) printf("%d ", data[i]);
printf("\n");
//初始化
listInitiate(&L, maxLen);
listInitiate(&L, maxLen);
//将键盘输入的元素依次放入动态顺序表中
for(i = 0; i < j; ++i)
insert(&L, i, data[i]);
//显示菜单
menu();
getchar();
while(1 ==scanf(" %d", &choose) )
{
switch(choose)
{
case 1: //将顺序表长度输出
printf("动态顺序表的长度为:%d\n", listLength(&L));
Sleep(2000);
menu();
break;
case 2: //插入操作
printf("请输入插入的元素和位置!\n");
scanf("%d %d", &x, &pos );
if(1 == insert(&L, pos, x)) printf("插入成功!\n");
Sleep(2000);
menu();
break;
case 3: //删除操作
printf("请输入删除的元素位置:");
scanf("%d", &pos );
if(1 == deleteList(&L, pos, &x)) printf("删除成功!\n");
Sleep(2000);
menu();
break;
case 4: //取出元素
printf("请输入要取出的元素位置:");
scanf("%d", &pos );
getList(&L, pos, &x);
printf("位置为%d的元素为:%d\n", pos, x);
Sleep(2000);
menu();
break;
case 5: //输出动态链表中的各元素
printf("动态链表中个元素分别为:");
for(i = 0; i < L.length; ++i)
{
getList(&L, i, &x);
printf("%d ", x);
for(i = 0; i < j; ++i)
insert(&L, i, data[i]);
//显示菜单
menu();
getchar();
while(1 ==scanf(" %d", &choose) )
{
switch(choose)
{
case 1: //将顺序表长度输出
printf("动态顺序表的长度为:%d\n", listLength(&L));
Sleep(2000);
menu();
break;
case 2: //插入操作
printf("请输入插入的元素和位置!\n");
scanf("%d %d", &x, &pos );
if(1 == insert(&L, pos, x)) printf("插入成功!\n");
Sleep(2000);
menu();
break;
case 3: //删除操作
printf("请输入删除的元素位置:");
scanf("%d", &pos );
if(1 == deleteList(&L, pos, &x)) printf("删除成功!\n");
Sleep(2000);
menu();
break;
case 4: //取出元素
printf("请输入要取出的元素位置:");
scanf("%d", &pos );
getList(&L, pos, &x);
printf("位置为%d的元素为:%d\n", pos, x);
Sleep(2000);
menu();
break;
case 5: //输出动态链表中的各元素
printf("动态链表中个元素分别为:");
for(i = 0; i < L.length; ++i)
{
getList(&L, i, &x);
printf("%d ", x);
}
printf("\n");
Sleep(2000);
menu();
break;
default: //处理异常操作
printf("输入的序号没有与操作菜单对应的,请重新输入!\n");
Sleep(2000);
menu();
break;
}
}
printf("\n已经退出菜单!\n");
printf("\n");
Sleep(2000);
menu();
break;
default: //处理异常操作
printf("输入的序号没有与操作菜单对应的,请重新输入!\n");
Sleep(2000);
menu();
break;
}
}
printf("\n已经退出菜单!\n");
//撤销顺序表所占的内存
destroy(&L);
destroy(&L);
return 0;
}
//初始化函数
void listInitiate(SeqList *L, int maxLen)
{
L->list = (DataType *)malloc(sizeof(DataType) * maxLen);
L->maxLen = maxLen;
L->length = 0;
}
//得到list长度函数
int listLength(SeqList *L)
{
return L->length;
}
//插入函数,成功返回1,反之为零
int insert(SeqList *L, int pos, DataType d)
{
int i;
if(pos < 0)
{
printf("参数pos出错!\n");
return 0;
}
else{
if(L->length >= L->maxLen)
{
printf("动态顺序表maxLen增加一个单位长度以完成插入操作!\n");
L->list = (DataType *)realloc(L->list, (L->maxLen + 1)*sizeof(DataType));
L->maxLen++;
}
//依次后移一个单位
L->length++;
for(i = L->length ; i >= pos; --i){
L->list[i] = L->list[i-1];
}
L->list[pos] = d;
return 1;
}
}
//删除函数,删除成功返回1,反之返回0;
int deleteList(SeqList *L, int pos, DataType *x)
{
int i;
if(L->length <= 0)
{
printf("已经没有可以删除的元素!\n");
return 0;
}
else if(pos < 0||pos > (L->length - 1))
{
printf("参数pos不合法");
return 0;
}
else
{
*x = L->list[pos];
for(i =pos; i < L->length; i++ ) L->list[i] = L->list[i+1];
L->length--;
return 1;
}
}
//取数据元素函数
void getList(SeqList *L, int pos, DataType *x)
{
if(pos < 0||pos > (L->length-1))
{
printf("参数pos不合法!");
}
else
{
*x = L->list[pos];
}
}
//撤销表L的占用的内存空间操作函数
void destroy(SeqList *L)
{
free(L->list);
L->maxLen = 0;
L->length = 0;
}
//显示菜单界面
void menu()
{
printf("************************* 操 作 菜 单 *******************************\n");
printf("************************* 1.显示元素个数 ************************\n");
printf("************************* 2.插 入 元 素 ************************\n");
printf("************************* 3.删 除 元 素 ************************\n");
printf("************************* 4.取数据元素 ************************\n");
printf("************************* 5.显示所有数据元素 ************************\n");
printf("************************* 操 作 菜 单 *******************************\n");
printf("请输入操作菜单上的序号以完成相应的操作!\n");
}
//撤销表L的占用的内存空间操作函数
void destroy(SeqList *L)
{
free(L->list);
L->maxLen = 0;
L->length = 0;
}
//显示菜单界面
void menu()
{
printf("************************* 操 作 菜 单 *******************************\n");
printf("************************* 1.显示元素个数 ************************\n");
printf("************************* 2.插 入 元 素 ************************\n");
printf("************************* 3.删 除 元 素 ************************\n");
printf("************************* 4.取数据元素 ************************\n");
printf("************************* 5.显示所有数据元素 ************************\n");
printf("************************* 操 作 菜 单 *******************************\n");
printf("请输入操作菜单上的序号以完成相应的操作!\n");
}