您的位置:首页 > 理论基础 > 数据结构算法

动态顺序表

2017-07-21 18:31 519 查看
#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");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息