#include
#include
#include
//#include
#include
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对不起,没有你要选择的操作");
}
}
}