顺序表

#include <stdio.h>   
#include <malloc.h>//包含malloc()   
#include <stdlib.h>//包含exit()     
//初始化数组   
void init_arr(struct Arr *parr,int len);  
//展示数组中的元素   
void show_arr(struct Arr *parr);  
//判断数组是否为空   
int is_empty(struct Arr *parr);  
//判断数组是否为满   
int is_full(struct Arr *parr);  
//对数组进行追加元素   
int append(struct Arr *parr,int i);  
//在数组中插入一个元素,pos表示在地pos个元素前插入i   
int insert(struct Arr * parr ,int pos,int i);  
//在数组中删除一个元素,pi将主函数中的i值改变为删除了的元素的值,pos表示删除第几个值   
int del(struct Arr * parr,int pos,int *pi);  
//将数组中的元素进行倒置   
int reverse(struct Arr * parr);  
//定义一个int类型的数组  
struct Arr  
{  
    int * pbase;//数组首元素的地址   
    int arr_len;//数组的长度   
    int arr_cnt;//数组的当前长度   
};
void menu(struct Arr *parr)
{
	int i;//控制菜单的变量
	int j;
	int tem;//存放删除的元素
	while(1)
	{
		printf("\t\t\t1、添加元素\n\t\t\t2、删除元素\n\t\t\t3、插入元素\n\t\t\t4、显示数组中的元素\n\t\t\t5、将数组倒置\n\t\t\t6、退出\n");
		scanf("%d",&i);
		switch(i)
		{
		case 1:
			printf("请输入一个整数:\n");
			scanf("%d",&j);
			append(parr,j);
			break;
		case 2:
			printf("要删除第几个元素?\n");
			scanf("%d",&j);
			del(parr,j,&tem);
			printf("删除的元素为:%d\n",tem);
			break;
		case 3:
			printf("您要在第几个位置上插入哪个整数?\n");
			scanf("%d%d",&j,&tem);
			insert(parr,j,tem);  
			break;
		case 4:
			show_arr(parr);  
			break;
		case 5:
			reverse(parr);
			break;
		case 6:
			exit(1);
			break;
		default:
			break;
		}
	}
}
int main()  
{  
    struct Arr arr;//该语句定义了一个数组,分配了内存空间,但是里边的数据都是垃圾值,所以必须进行初始化,使该数组成为一个真正的数组
	int len;
	printf("********************************************************************************");
	printf("\t\t\t数据结构-用c语言实现顺序表\n");
	printf("********************************************************************************\n");
	printf("请先初始化一个数组,输入数组的长度:\n");
	scanf("%d",&len);
	init_arr(&arr,len);//调用初始化函数来初始化一个数组,使得该结构体的关系域中有指向内存的地址,数组的长度和当前长度分别赋值。
    menu(&arr);
    return 0;  
}
int is_empty(struct Arr * parr)  
{  
    if(parr->arr_cnt==0)  
        return 1;  
    else   
        return 0;  
}  
int is_full(struct Arr *parr)  
{  
    if(parr->arr_cnt==parr->arr_len)  
    {  
        printf("数组已满!\n");  
        return 1;  
    }  
    else  
        return 0;  
}
void init_arr(struct Arr *parr,int len)  
{  
    parr->pbase=(int *)malloc(sizeof(int)*len);  
    if(parr->pbase==NULL)  
    {  
        printf("数组初始化不成功!\n\n");  
        exit(-1);  
    }  
    else  
    {  
        parr->arr_len=len;  
        parr->arr_cnt=0;  
        printf("数组初始化成功!\n\n");  
    }  
    return;  
}  
void show_arr(struct Arr * parr)  
{  
    if(is_empty(parr))  
    {  
        printf("数组为空!\n");  
    }  
    else  
    {  
        int i;  
        printf("当前数组含有的值:\n");  
        for(i=0;i<parr->arr_cnt;i++)  
        {  
            printf("%d\t",parr->pbase[i]);  
        }  
        printf("\n");  
    }  
    return;  
}    
int append(struct Arr *parr,int i)  
{  
    if(is_full(parr))  
    {  
        return 0;  
    }  
    else  
    {  
        parr->pbase[parr->arr_cnt]=i;//等同于*(parr->pbase+parr->arr_cnt)=i;
        (parr->arr_cnt)++;  
        return 1;  
    }  
}  
int insert(struct Arr * parr ,int pos,int i) //pos代表插入的位置,比相应的数组的下标值大一 
{  
    if(is_full(parr))  
        return 0;  
	//不能在第一个元素的前俩个元素的位置处插入,此时对应的数组下标为-1.也不能在最后一个元素的下一个位置处插入
    else if(pos<1 || pos>parr->arr_cnt+1)  
        return 0;  
    else   
    {  
        int j;  
        for(j=parr->arr_cnt;j>pos-1;j--)  
        {  
            parr->pbase[j]=parr->pbase[j-1];  
        }  
        parr->pbase[pos-1]=i;  
        parr->arr_cnt++;  
        return 1;  
    }  
}  
int del(struct Arr * parr,int pos,int *pi) //pos代表删除第几个元素,对应的数组下标比其小1. 
{  
    if(is_empty(parr))  
        return 0;  
    else if(pos<1 || pos>parr->arr_cnt)  
        return 0;  
    else  
    {  
        int i;  
        *pi=parr->pbase[pos-1];  
        for(i=pos;i<parr->arr_cnt;i++)  
        {  
            parr->pbase[i-1]=parr->pbase[i];  
        }  
        parr->arr_cnt--;  
        return 1;  
    }  
}  
int reverse(struct Arr * parr)  
{  
    int i,j,k;  
    i=0;j=parr->arr_cnt-1;  
    if(is_empty(parr))  
        return 0;  
    else  
    {  
        while(i<j)  
        {  
            k=parr->pbase[i];  
            parr->pbase[i]=parr->pbase[j];  
            parr->pbase[j]=k;  
            i++;  
            j--;  
        }  
        return 1;  
    }  
}  


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值