数据结构C语言实现顺序表的操作,这里是使用通俗易懂的多个函数调用,结构分明一点,值得注意的是定义顺序表时最好定义全局变量,这样在不同功能里的函数调用时操作的顺序表才唯一,因为不同函数里的变量作用域不一样。
例如:
chushihua 对应调用 initlist
qingkong 对应调用 destory
chazhao 对应调用 locate
shanchu 对应调用 delete
完整代码如下:
#include<stdio.h>
#define ElemType int
#define INITSIZE 10
typedef struct
{ ElemType *data;
int length;
int listsize;
}sqlist;
sqlist a;
void initlist(sqlist *L){
L->data=(ElemType *)malloc(sizeof(ElemType)*INITSIZE);
L->length=0;
L->listsize=INITSIZE;
}
void insert(sqlist *L,int i,ElemType x){
int j;
if(i<1||i>L->length+1) return 0;
if(L->length==L->listsize){
L->data=(ElemType *)realloc(L->data,(L->listsize+1)*sizeof(ElemType));
L->listsize++;
}
for(j=L->length-1;j>=i-1;j--){
L->data[j+1]=L->data[j];}
L->data[i-1]=x;
L->length++;
}
int locate(sqlist *L,ElemType x){
int i=0;
while(i<L->length){
if(L->data[i]==x){
return i+1;
}
else i++;
}
return 0;
}
int getlen(sqlist *L){
return(L->length);
}
int delete(sqlist *L,int i,ElemType *e){
int j;
if(i<1||i>L->length){
return 0;}
*e = L->data[i-1];
for(j=i;j<=L->length;j++)
L->data[j-1] = L->data[j];
L->length--;
return 1;
}
void searchmax(sqlist *L)
{
int i,j;
float a=0.0;
if(L->length==0)
{
printf("这是一个空表!!!没有数据,请重新输入!!!\n");
}
else
{
for(i=0;i<L->length-1;i++)
{
for(j=i+1;j<L->length;j++)
{
if(L->data[i]<L->data [j])
{
a=L->data [i];
L->data [i]=L->data [j];
L->data [j]=a;
}
}
}
printf("最大值为%5d\n次最大值为%5d\n\n",L->data [0],L->data [1]);
}
}
void list(sqlist *L){
int i;
for(i=0;i<a.length;i++){
printf("第%d个元素为:%d \n",i+1,a.data[i]);}
printf("\n");
}
void destroy(sqlist* L){
printf("顺序表已清空\n\n");
if(a.length!=0){
free(L->data);
}
}
void chushihua(){
int i;
initlist(&a);
for(i=0;i<a.listsize;i++){
printf("%d ",a.data[i]);
}
printf("\n顺序表动态分配初始化成功\n\n");
}
int charu(){
int i;
insert(&a,1,1);
insert(&a,2,2);
insert(&a,3,3);
insert(&a,4,4);
insert(&a,5,5);
insert(&a,6,6);
insert(&a,7,111);
printf("成功插入:");
for(i=0;i<a.length;i++)
printf("%d ",a.data[i]);
printf("\n");
printf("插入元素后顺序表中各个元素以及相应的下标为:\n");
for(i=0;i<a.length;i++){
printf("第%d个元素为:%d \n",i+1,a.data[i]);}
printf("\n");
return a.length;
}
void chazhao(){
int i;
int j;
printf("请输入你要查找的元素:",j);
scanf("%d",&j);
i=locate(&a,j);
if(i!=0){
printf("找到该元素,该元素在顺序表的位置是第%d位\n \n",i);
}else{
printf("顺序表中没有该元素\n\n");
}
}
void shuchu(){
getlen(&a);
printf("成功创立长度为 %d 的顺序表\n",a.length);
list(&a);
}
void shanchu(){
int i,q,j;
printf("请输入你要删除第几个元素:",j);
scanf("%d",&j);
delete(&a,j,&q);
for(i=0;i<a.length;i++)
printf("第%d个元素为:%d\n",i+1,a.data[i]);
printf("成功删除该元素\n\n");
}
void bijiao(){
searchmax(&a);
}
void qingkong(){
destroy(&a);
}
int main(){
int f;
printf("---------------------------------菜单----------------------------------\n");
printf(" 1.初始化顺序表 2.插入元素\n");
printf(" 3.查找元素 4.输出长度及各个元素\n");
printf(" 5.删除元素 6.输出最大值和次最大值\n");
printf(" 7.清空顺序表 \n");
printf("-----------------------------------------------------------------------\n");
while(1){
printf("请输入你的选择:");
scanf("%d",&f);
printf("\n");
switch(f){
case 1:
chushihua();
break;
case 2:
charu();
break;
case 3:
chazhao();
break;
case 4:
shuchu();
break;
case 5:
shanchu();
break;
case 6:
bijiao();
break;
case 7:
qingkong();
break;
}
}
}
运行最终效果: