动态顺序表

来源:互联网 发布:巴洛克的艺术风格 知乎 编辑:程序博客网 时间:2024/06/05 19:08
#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();

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");

 //初始化
 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);

    }
    printf("\n");
    Sleep(2000);
    menu();
       break;
  default: //处理异常操作
    printf("输入的序号没有与操作菜单对应的,请重新输入!\n");
    Sleep(2000);
    menu();
       break;
  }
 }
 printf("\n已经退出菜单!\n");

 //撤销顺序表所占的内存
 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");
}