#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
//线性表——顺序存储
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 10
#define ERROR 0
#define OK 1
#define OVERFLOW -2
typedef struct{
int *elem;
int length;
int listsize;
}Sqlist;
int destroy(Sqlist *L);
int disPlay_all(Sqlist *L);
int InitList_Sq(Sqlist *L);
int get_length(Sqlist *L);
int ListInsert_Sq(Sqlist *L,int i,int e);
int ListDelete_Sq(Sqlist *L,int i,int e);
int InitList_Sq(Sqlist *L)
{
int i;
L->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
if(!L->elem)
exit(OVERFLOW);
L->length = 10;
L->listsize = LIST_INIT_SIZE;
for(i=0;i<L->length;i++)
{
L->elem[i]=i;
}
return OK;
}
int get_length(Sqlist *L)
{
return L->length;
}
int destroy(Sqlist *L)
{
L->length=0;
}
int ListInsert_Sq(Sqlist *L,int i,int e)
{
int *newbase,*q,*p;
if(i<1||i>L->length+1)
return ERROR;
if(L->length>=L->listsize)
{
newbase = (int *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(int));
if(!newbase)
exit(OVERFLOW);
L->elem = newbase;
L->listsize+=LISTINCREMENT;
}
q=&(L->elem[i-1]);
for(p=&(L->elem[L->length-1]);p>=q;--p)
*(p+1)=*p;
*q =e;
++L->length;
return OK;
}
int ListDelete_Sq(Sqlist *L,int i,int e)
{
int *p,*q;
if(i<1||i>L->length)
return ERROR;
p=&(L->elem[i-1]);
e=*p;
q=L->elem+L->length-1;
for(++p;p<=q;++p)
*(p-1)=*p;
--L->length;
return OK;
}
int disPlay_all(Sqlist *L)
{
int i;
for(i=0;i<L->length;i++)
{
printf("%d",L->elem[i]);
printf(" ");
}
return OK;
}
int main()
{
Sqlist L;
int get,e=0;
int i,num;
InitList_Sq(&L);
printf("请输入你要进行操作的序号\n");
printf("1.线性表置空\n");
printf("2.求线性表的长度\n");
printf("3.数据元素的插入操作\n");
printf("4.数据元素的删除操作\n");
printf("5.显示线性表中的全部元素\n");
printf("6.退出\n");
scanf("%d",&get);
switch(get)
{
case 1:
destroy(&L);
break;
case 2:
printf("该线性表的长度为:%d\n",get_length(&L));
break;
case 3:
//在指定位置上插入指定的数据元素
printf("输入你要插入的元素的位置(即在第i个元素之前插入)以及插入元素(逗号隔开)");
scanf("%d,%d",&i,&num);
ListInsert_Sq(&L,i,num);
printf("新的线性表是\n");
disPlay_all(&L);
break;
case 4:
//删除指定位置的数据元素
printf("请输入你要删除的元素的位置\n");
scanf("%d",&i);
ListDelete_Sq(&L,i,e);
printf("新的线性表是\n");
disPlay_all(&L);
break;
case 5:
//显示线性表的所有元素
disPlay_all(&L);
printf("\n");
case 6:
printf("退出\n");
break;
default :
printf("无此操作!\n");
break;
}
return OK;
}