//----------------------------线性表的动态分配顺序存储结构-------------------------
# include "stdio.h"
# include "malloc.h"
# include "stdlib.h"
# define M 5 //线性表存储空间的初始分配量
# define N 2 //线性表存储空间的分配增量
typedef struct {
int *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(int)为单位)
}SqList;
int InitList(SqList *L) { // 构造一个空的线性表L
L->elem=(int *)malloc(M*sizeof(int));
if(!L->elem) // 存储分配失败
exit(-2);
L->length=0; // 空表长度为0
L->listsize=M; // 初始存储容量
return 1;
}
int IntPut(SqList *L) { //输入数据
int i,e;
printf ("请输入你要输入数据的个数:\n");
scanf ("%d",&e);
if (1>e||5<e) { //判断输入数据的个数是否合格,若不合格请重新输入
do{
printf ("你输入的数据有误!请重新输入:\n");
scanf ("%d",&e);
}while(1>e||5<e);
}
printf ("输入正确!\n请开始输入数据并用空格隔开:\n");
for (i=0;i<e;i++) { //开始输入数据
scanf ("%d",&L->elem[i]);
L->length=L->length+1;
}
return 1;
}
int OutPut(SqList *L) { //输出数据
int i;
for (i=0;i<L->length;i++) {
printf ("%d",L->elem[i]);
printf ("\n");
}
return 1;
}
int Find(SqList *L) { //在顺序线性表L中查第i个值,若到,则打印出对应的值
int i;
printf ("请输入你要查的数据序号:\n");
scanf ("%d",&i);
if (1>i||L->length<i) { //判断输入的序号是否合格,若不合格请重新输入
do{
printf ("你输入的数据有误!请重新输入:\n");
scanf ("%d",&i);
}while(1>i||L->length<i);
}
printf ("输入的序号正确!\n你输入的序号所对应的数据是:\n");
printf ("%d\n",L->elem[i-1]); //打印出对应的值
return 0;
}
int ListInsert(SqList *L) { // 在顺序线性表L的第i个元素之前插入新的元素e,
// i的合法值为1≤i≤ListLength(L)+1
int *y,*q,*p,i,e;
printf ("请输入你要插入的数据序号:\n");
scanf ("%d",&i);
if (1>i||(L->length+1)<i) { // 判断输入的序号是否合格,若不合格请重新输入
do{
printf ("你输入的数据有误!请重新输入:\n");
scanf ("%d",&i);
}while(1>i||(L->length+1)<i);
}
printf ("输入的序号正确!\n请输入你要插入的数据:\n");
scanf ("%d",&e);
if(L->length>=L->listsize) { // 当前存储空间已满,增加容量
y=(int *)realloc(L->elem,(L->listsize+N)*sizeof(int));
if(!y) // 存储分配失败
exit(-2);
L->elem=y; // 新基址
L->listsize+=N; // 增加存储容量
}
q=&(L->elem[i-1]); // q为插入位置
for(p=&(L->elem[L->length-1]);p>=q;--p) // 插入位置及之后的元素右移
c语言listinsert函数 *(p+1)=*p;
if(L->length>6){
printf ("插入失败,线性表L已满!\n");
return 1;
}
*q=e; // 插入e
++L->length; // 表长增1
return 1;
}
int ListDelete(SqList *L,int &e) { // 在顺序线性表L中删除第i个元素,并用e返回其值。
// i的合法值为1≤i≤ListLength(L)
int *p,*q,i;
printf ("请输入你要删除的数据序号:\n");
scanf ("%d",&i);
if (1>i||L->length<i) { // 判断输入的序号是否合格,若不合格请重新输入
do{
printf ("你输入的数据有误!请重新输入:\n");
scanf ("%d",&i);
}while(1>i||L->length<i);
}
printf ("输入的序号正确!\n");
p=&(L->elem[i-1]); // p为被删除元素的位置
e=*p; // 被删除元素的值赋给e
q=L->elem+L->length-1; // 表尾元素的位置
for(++p;p<=q;++p) // 被删除元素之后的元素左移
*(p-1)=*p;
--L->length; // 表长减1
return 1;
}
void menu() { //菜单
system("cls");
printf ("\t|===========================================================|\t\n");
printf ("\t| |\t\n");
printf ("\t| 线性表的顺序表示与实现 |\t\n");
printf ("\t| |\t\n");
printf ("\t|===========================================================|\t\n");
printf ("\n\t 【1】 建立线性表! \t\t\t【2】 输入数据!\n");
printf ("\n\t 【3】 输出数据! \t\t\t【4】 查!\n");
printf ("\n\t 【5】 插入!\t\t\t\t【6】 删除!\n");
printf ("\n\t 【0】 退出程序!\n");
}
int main () { //主函数
int i,e;
SqList L;
system("color 9F");
while(1) {
menu();
printf ("\n\n\t\t\t请输入的你的选择:"); //输入选择的功能序号
scanf ("%d",&i);
switch(i) {
case 1: //建立线性表
InitList(&L);
printf ("构建一个空线性表完毕!\n");
system("pause");
break;
case 2: //输入数据
IntPut(&L);
system("pause");
break;
case 3: //输出数据
printf ("你输入的数据如下:\n");
OutPut(&L);
system("pause");
break;
case 4: //查
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论