c_数据结构_顺序表

#define OK 1
#define ERROR 0
#define OVERFLOW  -2
#define LIST_INIT_SIZE  100   // 线性表存储空间的初始分配量
#define List_Increment 10   //线性表存储空间的分配增量 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct{

    int *elem;   //存储空间的基地址  
    int length;
    int listsize;   //定义的一个大小

}SqList;   //申请结构体变量SqList ,SqList作为类型可以声明新的结构体变量,如:SqList l,m[34],*n;
 


//初始化 (构造空的线性表)
InitList_Sq(SqList &L)
 {  
    L.elem=(int *)malloc(LIST_INIT_SIZE * sizeof(int));  //存储空间的元素空间大小
    if(!L.elem)exit(OVERFLOW);      // 若没有表,则返回overflow
    L.length=0;
    L.listsize= LIST_INIT_SIZE;
    printf("------------------申请空间成功----------------\n");
    return OK;
}
struct GetElem_Sq(SqList&L,int i, int &e){    //查找元素

    printf("请输入查找位置:");
    scanf("%d",&i);
    if(i<1 || i>L.length) {  //判断查找元素是否在申请空间内
        printf("元素不在空间位置内!!\n\n");
        return ERROR;
    }
    e=L.elem[i-1];     // 逐个查找元素
    printf("查找的元素为:%d\n\n",e);
    return OK;

};


//在i位置插入元素
ListInsert_Sq(SqList&L,int i,int e){   
    int *p,*q;
    printf("请输入插入位置:");
    scanf("%d",&i);
    printf("插入数据:");
    scanf("%d",&e);
    if(i<1||i>L.length+1){
        printf("插入位置不在顺序空间内!!!\n\n");   // 如果i值不合法(没有在申请空间内)则返回0
        return ERROR;
    }
    if(L.length>=L.listsize){         //如果存储空间已满,则增加分配容量
        int* newbase=(int*)realloc(L.elem,(L.listsize+List_Increment)*sizeof(int));   //再次申请空间
        if(newbase==NULL)
            printf("存储空间分配失败\n\n");   //存储空间分配失败
        L.elem=newbase;          //新的基地址
        L.listsize=L.listsize+List_Increment;    //容量增加
    }
    q=&L.elem[i-1];      //e元素在i处插入
    for(p=&(L.elem[L.length-1]);p>=q;--p)      //元素值整体后移
        *(p+1)=*p;
    *q=e;             //插入e元素
    ++L.length;   //表长加一
    return OK;
}

ListDelete_Sq(SqList&L,int i,int &e){     // 删除列表中某个位置的元素
    int *p,*q;
    printf("请选出删除元素位置:");
    scanf("%d",&i);
    if(i<1 || i>L.length){            // 判断删除位置是否在存储空间内
        printf("删除位置不在空间内!!!\n\n");
        return ERROR;
    }
    p=&(L.elem[i-1]);   //p为被删除的元素
    e=*p;
    printf("删除值为:%d\n\n",e);
    q=L.elem+L.length-1;  // 表长减一
    for(++p;p<=q;p++)    //删除元素后 后继元素整体前移
        *(p-1)=*p;
    --L.length;
    return OK;

}

int creatnewlist(SqList &L)            //创建列表 
{
    int i,n;    
    printf("\n\n请用户先存入数据\n\n请选择存入数据个数:");    
    scanf("%d",&n);
    while(n<=0){    
        printf("\n数据个数小于‘1’\n请重新存入数据个数:");
        scanf("%d",&n);
    }
    printf("请输入%d个数据:\n",n);    
    if(n>LIST_INIT_SIZE){  
        L.elem=(int *)realloc(L.elem,(n+List_Increment)*sizeof(int));  //再次申请空间
        if(!L.elem)exit(OVERFLOW);           //如果没有列表 则返回overflow 0
        L.listsize=n+List_Increment;    
    }
    for(i=0;i<n;i++)               //将元素逐一写入列表
    //    printf("-----------\n");
        scanf("%d",L.elem+i);
    L.length=n;
    return OK;
}
// 逐一打印列表中的元素
int pr(SqList &L){
    int i;
    if(L.length<1){
        printf("列表为空!!\n\n");
    }else{
        for(i=0;i<L.length;i++){
            printf("表中元素第%d个元素为:%d\n\n",i,*(L.elem+i));
        
        }
    
    }
        return OK;
}
void ClearList(SqList &L){   //释放已经申请的空间

    free(L.elem);
    printf("释放空间成功!!\n\n");
    InitList_Sq(L);     //调用 InitList_Sq() 创建空的线性表
    creatnewlist(L);    //调用 createnewlist()建立新的列表 
}

void OperateMenu(){       //操作菜单

    printf("--------------元素处理方式---------\n\n");
    printf("0> 退出\n\n");
    printf("1>: 查找给定位置的数据\n\n");
    printf("2>: 插入元素\n\n");
    printf("3>: 删除元素\n\n");
    printf("4>: 打印元素\n\n");
    printf("5>: 释放原列表,创建新列表\n\n");
    printf("请选择对元素的处理:");

    
}

void main(){
    int i=1,e=0,k,boo=1,w=0;
    SqList L;    //声明
    printf("注:此测试过程输入值应全为数字\n\n");
    printf("请用户选择存入数据或退出程序:\n\n");
    printf("存入数据请输入:'1'\n\n");
    printf("退出请选择'0'或 其它!!\n\n");
    printf("请选择:");
    scanf("%d",&w);
    if(w==1){
        InitList_Sq(L);     //调用 InitList_Sq() 创建空的线性表
        creatnewlist(L);    //调用 createnewlist()建立新的列表 
        OperateMenu();     //指令导向
        scanf("%d",&k);
        while(k){
            switch (k)
            {
                case 0:break;
                case 1:boo=GetElem_Sq(L,i,e);
                    if(boo)
                        printf("查询成功!!\n\n");
                    else
                        printf("查询失败!!\n\n");
                       break;
                case 2:boo=ListInsert_Sq(L,i,e);
                    if(boo)
                        printf("插入成功!!\n\n");
                    else
                        printf("插入失败!!\n\n");
                    break;
                case 3:boo=ListDelete_Sq(L,i,e);
                    if(boo)
                        printf("删除成功!!\n\n");
                    else
                        printf("删除失败!!\n\n");
                    break;    
                case 4:pr(L);
                    break;
                case 5:ClearList(L);break;
            }
            OperateMenu();
            scanf("%d",&k);
        }
    }else{
        exit(OVERFLOW);
    }

}

 

posted @ 2018-11-16 19:52  yin_zhaozhao  阅读(225)  评论(0编辑  收藏  举报