#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
typedef struct {
int elem[MaxSize];
int listlength;
}SeqList;
void InitList(SeqList *); //初始化线性表l。
int EmptyList(SeqList); //判断线性表l是否为空表,如果l为空表则返回1,否则返回0。
int ListLength(SeqList); //求线性表l的长度。
int Locate(SeqList,int); //求线性表l中元素e的位置。
int GetData(SeqList,int); //返回线性表l中第i个元素的值。
void InsList(SeqList *,int i,int e); //在l中第i个元素(位置)之前插入数据元素e。
void DelList(SeqList *,int i); //删除l中的第i个数据元素。
//================-----------------------================
#define SS "***======================================***"
void main(){
int xx;
SeqList HL;
InitList(&HL);
Head:
fflush(stdin);
system("cls");
printf("%s\n",SS);
printf(" 请选择链表操作(所有链表都带有头结点):\n");
printf(" 1.初始化;\n");
printf(" 2.插入;\n");
printf(" 3.删除;\n");
printf(" 4.是否为空;\n");
printf(" 5.获取长度;\n");
printf(" 6.查找;\n");
printf(" 7.获值;\n");
printf(" 8.退出。\n");
printf("%s\n",SS);
printf(" 输入您的选择(编号):");
scanf("%d",&xx);
system("cls");
int i,x;
printf("%s\n",SS);
switch(xx){
case 1:
InitList(&HL);
break;
case 2:
printf(" 输入位置及其数值(若位置为0结束):");
while(scanf("%d",&i),i!=0){
scanf("%d",&x);
InsList(&HL,i,x);
printf(" 输入位置及其数值(若位置为0结束):");
}
printf(" 此时表的长度为:%d;\n",ListLength(HL));
break;
case 3:
printf(" 要删除第几个元素(输入0结束):");
while(scanf("%d",&i),i!=0){
DelList(&HL,i);
printf(" 要删除第几个元素(输入0结束):");
}
break;
case 4:
if(EmptyList(HL)==1)printf(" 线性表不为空;\n");
else printf(" 线性表为空;\n");
break;
case 5:
printf(" 线性表的长度为:%d;\n",ListLength(HL));
break;
case 6:
printf(" 输入要查找的值:");
scanf("%d",&x);
printf("\n");
if(Locate(HL,x)==-1)printf(" 查找的元素不存在;\n");
else printf(" 元素%d在第%d个位置;\n",x,Locate(HL,x));
break;
case 7:
printf(" 要获取第几个元素的值:");
scanf("%d",&i);
x=GetData(HL,i);
if(x==NULL)printf(" 位置不存在;\n");
else printf(" 第%d个元素的值是:%d。\n",i,x);
break;
case 8:
printf("\n ");
system("cls");
exit(0);
default:
goto Head;
}
printf("%s\n",SS);
printf("\n 操作结束,按任意键返回;\n");
system("pause >nul 2>nul");
goto Head;
}
//================-----------------------================
//初始化线性表l。
void InitList(SeqList *l){l->listlength=0;}
//判断线性表l是否为空表,如果l为空表则返回1,否则返回0。
int EmptyList(SeqList l){return l.listlength==0?0:1;}
//求线性表l的长度。
int ListLength(SeqList l){return l.listlength;}
//求线性表l中元素e的位置。
int Locate(SeqList l,int e){
int i=l.listlength;
while(--i){
if(l.elem[i]==e)break;
}
if(i)
return i+1;
else
return -1;
}
//返回线性表l中第i个元素的值。
int GetData(SeqList l,int i){
if(i>l.listlength){
printf("\n Error!\n");
return NULL;
}
return l.elem[i-1];
}
//在l中第i个元素(位置)之前插入数据元素e。
void InsList(SeqList *l,int i,int e){
if(i==(*l).listlength+1){
(*l).elem[i-1]=e;
(*l).listlength++;
}
else if(i<=(*l).listlength){
for(int j=(*l).listlength-1;j>=i-1;j--)
(*l).elem[j+1]=(*l).elem[j];
(*l).elem[i-1]=e;
(*l).listlength++;
}
else
printf("\n Error!\n");
}
//删除l中的第i个数据元素。
void DelList(SeqList *l,int i){
for(int j=i-1;j<(*l).listlength-2;j++)
(*l).elem[j]=(*l).elem[j+1];
//(*l).listlength--;
l->listlength--;
}