线性表之顺序表的结构与实现

顺序表:  是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。

#include  "stdafx.h"
#include<iostream>
using namespace std;
#include<malloc.h>
#define LIST_INIT_SIZE  100        //初始化大小
#define LISTINCREMENT   10        //线性表满时增加的幅度
#define OVERFLOW        -1        //内存溢出
#define OK               1        //正确
#define ERROR            0        //失败
typedef int Status;                //定义Status为int类型,表示返回标志
typedef int ElemType;
typedef int KeyType;

typedef  struct{                //定义结构体
    ElemType *elem;
    KeyType *key;
    int  length;                //记录当前长度
    int  listsize;                //记录当前总长度
}SqList;


//初始化
Status InitList (SqList &L){ /*定义一个线性表,    &L表示形参是一个引用变量 */  
    int length1;
    printf("请确定顺序表的长度:");
    scanf("%d",&length1);
    L.elem=(ElemType*)malloc(length1*sizeof(ElemType));
    if(!L.elem){
        printf("out of space");
        exit(OVERFLOW);
    }
    L.length=0;
    L.listsize=length1;
    return OK;
}

//插入   
Status Listinsert (SqList &L,int i, ElemType e){ /*在i元素的前面插入元素e*/
    ElemType  *p,*q,*newbase;
    if(i<1 || i>L.length+1){//位置错误
        return ERROR;
    }
    if(L.length >= L.listsize )//长度超过或等于总长度,需要开辟空间
    {
       newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
       if (newbase==NULL){
            printf("out of space");
            return (OVERFLOW);
       }
       L.elem=newbase;
       L.listsize+=LISTINCREMENT;
    }
    //将i-1后面的元素统一往后移动一个位置
    p = &(L.elem[i-1]);
    for (q=&(L.elem[L.length-1]) ;q>=p;q--){
        *(q+1)=*q;
    }
    //给i-1位置赋值,就是元素e
    L.elem[i-1]=e;
    //长度加1
    L.length++;                    
    return OK;
}

//删除
Status DeleteList(SqList &L,int i){/*删除i个元素*/
    //定义两个指针,一个指向要操作(删除)的位置,一个指向顺序表最后一个元素的位置
    ElemType   *q ,*p;
    if(i<1||i>L.length){
        return ERROR;
    }
    //向前移动位置
    q = &(L.elem[i-1]);
    p = L.elem+L.length-1;
    for (q++; q <= p; q++){
        *(q-1) = *q;
    }
    //长度减一
    L.length--;
    return OK;
}

//查找元素的位置
int Location(SqList &L,ElemType e)
{
    ElemType   *q,*p;
    q = &L.elem[0]; //找到表中数据的提示位置
    for(int i=0;i<L.length;i++,++q){//循环表的实际长度
        if(*q == e){
            return i+1;
        }
    }
    return -1;
}

//输出顺序表
void print(SqList *l){
    ElemType *p;
    p = l->elem; //找到表中数据的提示位置
    for(int i=0;i<l->length;i++){
        printf("%4d",*p);
        p++;
    }
}
int main(int argc,char* argv[]){
    SqList L,*sl;
    int i,e,pos=-1;
    InitList (L);
    
    printf("请向表中置入元素:\n");
    for(i=0;i<L.listsize;i++){ 
        scanf("%d",&(L.elem[i]));
        L.length++; 
    }
    printf("所创建的线性表为:\n");
    sl=&L;
    print(sl);
    printf("\n");
    printf("请输入要查找元素:") ;
    scanf("%d",&e);
    pos = Location(L,e);
    cout<<"查找元素的位置为:"<<pos<<endl;
    printf("\n");
    printf(pos+"");
    printf("请输入要删除的元素的位置:") ;
    scanf("%d",&i);
    DeleteList(L, i) ;
    printf("删除后的线性表为:\n");
    for(i=0;i<L.length;i++){
        printf("%4d",L.elem[i]);
    }
    printf("\n");
    printf("\n");
    printf("请输入要插入的位置和元素:") ;
    scanf("%d%d",&i,&e);
    Listinsert (L,i,e);
    printf("插入后的线性表为:\n");
    for(i=0;i<L.length;i++){
        printf("%4d",L.elem[i]);
    }
    printf("\n");
    
    return OK;
}

 

posted @ 2013-08-28 14:55  若 ♂ 只如初见  阅读(279)  评论(0编辑  收藏  举报