顺序表(动态分配内存)

来源:互联网 发布:java反射找不到方法 编辑:程序博客网 时间:2024/06/07 13:12

#include<iostream>// 顺序表(动态分配内存)
#include<cstdio>
#include<string>
//#include<conio.h>
#include<dos.h>// 用来清屏
using namespace std;
const int list_size = 1000;
const int list_SIZE = 10;

typedef struct
{
 int *elem; // 存储空间基址
 int len;   // 当前长度
 int listsize; //当前分配的存储容量(以sizeof(int))为单位
}list;
/*
void empty(list &l)
{
 l.elem = NULL;
}//构造空表
*/
int Initlist(list &l)
{
 l.elem = (int *)malloc(list_size*(sizeof(int)));
 if(!l.elem)
 {
  printf("/n/t/t分配内存失败");
  return 0;
 }
 l.len = 0;
 l.listsize = list_size;
 return 1;
}//构造顺序表

void creat(list &l)
{
 int n;
 printf("/n/t/t输入顺序表的长度 n = ");
 scanf("%d", &n);
 l.len = n;
 //int i;
 printf("/n/t/t输入各个元素:");
 int *p, *q;
 p = &l.elem[0];
 q = l.elem + l.len - 1;
 for(p; p <= q; p++)
  scanf("%d", p);// 本来scanf 读入的时候就要就要加&的,这里是指针就不用*了,加了,纠结了好久
 /*
 for(i = 0; i < l.len; i++)
   scanf("%d", &l.elem[i]);
   */
}//创建顺序表

int length(list l)
{
 return l.len;
}//求顺序表的长度

int get(list &l, int n)
{
 if(n < 0 || n > l.len)
 {
  printf("/n/t/t参数位置不正确/n");
  return 0;
 }

 int *p;
  p = &l.elem[n- 1];
  return *p;
 //return l.elem[n- 1];
}//取表中第n个元素

int lacate(list l, int x)
{
 
 int i = 0;
 for(i = 0; i < l.len; i++)
  if(l.elem[i] == x)
   return i + 1;
 return -1;//表示没有找到x

}//查找顺序表中为x的元素,返回其下表,没有的话返回-1;

int insnode(list &l, int i, int x)
{
 if(i <= 0 || i > l.len + 1)
 {
  printf("/n/t/t插入的位置不正确/n");
  return 0;
 }
 if(l.len >= l.listsize)
 {
  int *newbase;
  newbase = (int *)realloc(l.elem, (l.listsize + list_SIZE) * sizeof(int));
  if( !newbase )
  {
   printf("/n/t/t分配内存失败");
   return 0;
  }
  l.elem = newbase;
  l.listsize += list_SIZE;
 }
 if(l.len + 1 == i)
 {
  l.elem[l.len] = x;
  l.len ++;
  return 1;
 }
 int *q, *p;
 q = &l.elem[i -1];
 for(p = &l.elem[l.len - 1]; p>= q; p--)
  *(p + 1) = *p;
 *q = x;
 l.len++;
 return 1;
 /*
 if(i < 0 || i > l.len)
 {
  printf("/n/t/t插入的位置不正确/n");
  return 0;
 }
 int j;
 l.len++; //这里不要忘记了加
 for(j = l.len; j >= i; j--)
  l.elem[j] =l.elem[j - 1];
 l.elem[i - 1] = x;
 return 1;
 */
}//在顺序表位置为i的地方插入x

int  delnode(list &l, int i, int &e)
{
 if(i < 0 || i > l.len)
 {
  printf("/n/t/t删除的位置不正确/n");
  return 0;
 }
 int *p, *q;
 p = &l.elem[i - 1];
 e = *p;
 q = l.elem + l.len - 1;
 for(p; p < q; p++)
  *p = *(p + 1);
 l.len--;
 return 1;
 /*
 if(i < 0 || i > l.len)
 {
  printf("/n/t/t删除的位置不正确/n");
  return 0;
 }
 int j;
 for(j = i; j < l.len; j++)
  l.elem[j - 1] = l.elem[j];
 l.len--;
 return 1;
 */
}//删除顺序表位子为i 的元素

void display(list l)
{
 int *p, *q;
 p = &l.elem[0];
 q = l.elem + l.len - 1;
 for(p; p <= q; p++)
  printf("%d ", *p);
 /*
 int i;
 printf("/n/t/t");
 for(i = 0; i < l.len; i++)
  printf("%d ",l.elem[i]);
  */
}//显示顺序表

void fun()
{
  printf("/n/t/t*********************************************************");
  //printf("/n/t/t*********      1  构造空表                      *********");
  printf("/n/t/t*********      2  构造链表                      *********");
  printf("/n/t/t*********      3  求顺序表的长度                *********");
  printf("/n/t/t*********      4  取表中第n个元素               *********");
  printf("/n/t/t*********      5  查找顺序表中为x的元素         *********");
  printf("/n/t/t*********      6  顺序表位置为i的地方插入x      *********");
  printf("/n/t/t*********      7  删除顺序表位子为i 的元素      *********");
  printf("/n/t/t*********      8  显示顺序表                    *********");
  printf("/n/t/t*********      9  清除屏幕                      *********");
  printf("/n/t/t*********      10 退出循环                      *********");
  printf("/n/t/t*********************************************************");
  printf("/n");

}
int main()
{
 list l;
 int a;
        //printf("/n/n/n/n");
  printf("/n/t/t*********************************************************");
  //printf("/n/t/t*********      1  构造空表                      *********");
  printf("/n/t/t*********      2  构造链表                      *********");
  printf("/n/t/t*********      3  求顺序表的长度                *********");
  printf("/n/t/t*********      4  取表中第n个元素               *********");
  printf("/n/t/t*********      5  查找顺序表中为x的元素         *********");
  printf("/n/t/t*********      6  顺序表位置为i的地方插入x      *********");
  printf("/n/t/t*********      7  删除顺序表位子为i 的元素      *********");
  printf("/n/t/t*********      8  显示顺序表                    *********");
  printf("/n/t/t*********      9  清除屏幕                      *********");
  printf("/n/t/t*********      10 退出循环                      *********");
  printf("/n/t/t*********************************************************");
  printf("/n");
 Initlist(l);
 while(1)
 {
  printf("/n/t/t请输入你要的操作 a = ");
  scanf("%d", &a);
  /*if(a == 1)
  {
   Initlist(l);
   
  }*/
   if(a == 2)
  {
   creat(l);
   printf("/n/t/t显示插入后的顺序表:");
   display(l);

  }
  else if(a == 3)
  {
   printf("/n/t/t%d", length(l));
  }
  else if(a == 4)
  {
   int b;
   printf("/n/t/t请输入你要取的顺序表的位置:");
   scanf("%d", &b);
   printf("/n/t/t位置为b的元素为:%d", get(l,b));

  }
  else if(a == 5)
  {
   int x;
   printf("/n/t/t查找顺序表中为x的元素x = ");
   scanf("%d", &x);
   if( lacate(l, x) == -1)
    printf("/n/t/t没有找到元素x");
   else
    printf("/n/t/t输出元素x的位置:%d", lacate(l, x));
  }
  else if(a == 6)
  {
   int i, x;
   printf("/n/t/t输入你要插入位置i = ");
   scanf("%d", &i);
   printf("/n/t/t输入你要插入的元素x = ");
   scanf("%d", &x);
   insnode(l, i, x);
   printf("/n/t/t显示插入后的顺序表:");
   display(l);

 

  }
  else if(a == 7)
  {
   int i;
   int n;
   printf("/n/t/t输入你要删除的位置i = ");
   scanf("%d", &i);
   delnode(l, i, n);
   printf("/n/t/t显示删除的元素:%d",n);
   printf("/n/t/t显示s删除后的顺序表:");
   display(l);
  }
  else if(a == 8)
  {
   printf("/n/t/t显示顺序表:");
   display(l);
  }
  else if(a == 9)
  {
   system("cls");
   fun();
   //clrscr();
  }
  else if(a == 10)
  {
   break;
  }
  else
  {
   printf("/n/t/t对不起,没有你要选择的操作");
  }

 }
}

 

原创粉丝点击