您的位置:首页 > 理论基础 > 数据结构算法

线性表---顺序表

2015-08-05 18:43 537 查看
#include<stdio.h>

#include<stdlib.h>

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERRORR 0

#define OVERFLOW -1

#define LIST_INIT_SIZE  100 //线性表存储空间的初始分配量

#define LISTINCREMENT 10
//线性表存储空间的分配增量

typedef int ElemType;

typedef struct{
ElemType *elem;
//存储空间基址 
int length;
//当前长度 
int listsize;
//当前分配的存储容量(以sizeof(Elemtype)为单位) 

}SqList; 

//构造一个空的顺序表 L 

void InitList_Sq(SqList *L){
L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(! L->elem){
exit(OVERFLOW);
//存储空间分配失败
}
L->length = 0;
//空表长度为零 
L->listsize = LIST_INIT_SIZE;
//初始化存储容量 

}

//在顺序表L中的第i个位置之前插入一个元素e 

int ListInsert_Sq(SqList *L,int i,ElemType e){
ElemType *p , *q;
if(i<1 || i>(L->length + 1)){
return ERRORR;
}
//当前存储空间已满,增加分配 
if(L->length >= L->listsize){
ElemType *newbase = (ElemType *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
//存储分配失败 
if(!newbase){
exit(OVERFLOW);
}
L->elem = newbase;
//新基址 
L->listsize += LISTINCREMENT;
//增加存储容量 
}
q = &(L->elem[i-1]); //q为要插入的位置 
for(p=&(L->elem[L->length-1]); p>= q; --p){
*(p+1) = *p;
//插入位置及其之后的元素往后移 
}
*q = e; //插入e
++L->length;
//表长加1 
return OK; 

}

//删除顺序表L中的第i个位置的元素,并用e返回删除的元素的值

int ListDelete_Sq(SqList *L,int i,ElemType *e){
ElemType *p , *q;
if(i<1 || i>L->length){
return ERRORR;
}
q = &(L->elem[i-1]);//q为要删除的位置 
*e = *q;
for(p = &(L->elem[i-1]);p<&(L->elem[L->length-1]);p++){
*p = *(p+1);

--L->length;
//表长减1 
return OK; 



//返回顺序表L中元素的个数 

int ListLength(SqList *L){
return L->length;



//查询并用e返回L中第i个元素的值 

int GetElem(SqList *L,int i,ElemType
*e){
*e = *(&(L->elem[i-1]));

}

//返回L中第一个值等于e的数据元素的位序

int LocateElem(SqList *L,ElemType e){
int i;
for(i=0;i<L->length
;i++){
if(L->elem[i] == e){
return i+1;
}
}
return 0;



//若cur_e不是第一个元素,则用prev_e返回它的直接前驱的值

int PriorElem(SqList *L,ElemType cur_e,ElemType
*prev_e){
int i;
if(L->elem[0] == cur_e){
return 0;
}
for(i=1;i<L->length
;i++){
if(L->elem[i] == cur_e){
*prev_e = L->elem[i-1];
return 1;
}
}
return 0;



//若cur_e不是最后一个元素,则用next_e返回它的直接后继的值

int NextElem(SqList *L,ElemType cur_e,ElemType
*next_e){
int i;
for(i=0;i<L->length
;i++){
if(i == L->length){
return 0;
}
if(L->elem[i] == cur_e){
*next_e = L->elem[i+1];
return 1;
}
}
return 0;



//遍历顺序表 

int ListTraverse(SqList *L){
int i; 
for(i=0; i<L->length; i++){
printf("%d | ",L->elem[i]);

}
printf("\n");

}

int main(){
SqList *L;
int elem; 
int loc;
ElemType *e1;
InitList_Sq(L);
/*******START 按位置插入元素*******/ 
printf("插入位置Loc:\n");
scanf("%d",&loc);
printf("插入元素elem:\n");
scanf("%d",&elem);
while(elem != 999){
ListInsert_Sq(L,loc,elem);

printf("插入位置Loc:\n");
scanf("%d",&loc);
printf("插入元素elem:\n");
scanf("%d",&elem);
}
/*******END *******/ 
ListTraverse(L);
printf("顺序表的长度为:%d\n",ListLength(L));

/*******START 查找L中第一个值为elem的元素的后继元素的值*******/
printf("请输入要查询后继元素的值:\n"); 
scanf("%d",&elem);
NextElem(L,elem,e1);
printf("第一个值为%d的元素的后继为:%d\n",elem,*e1);
/*******END*******/

/*******START 查找L中第一个值为elem的元素的前驱元素的值*******/
printf("请输入要查询前驱元素的值:\n"); 
scanf("%d",&elem);
PriorElem(L,elem,e1);
printf("第一个值为%d的元素的前驱为:%d\n",elem,*e1);
/*******END*******/

/*******START 查找L中第一个值为elem的元素的位置*******/
printf("请输入要查询元素的值:\n"); 
scanf("%d",&elem);
printf("第一个值为%d的元素为第%d个元素\n",elem,LocateElem(L,elem));
/*******END*******/

/*******START 查找并返回L中第i个位置的元素*******/
printf("请输入要查询元素的位置:\n"); 
scanf("%d",&loc);
GetElem(L,loc,e1);
printf("第%d个位置的元素值为:%d\n",loc,*e1);
/*******END*******/

/*******START 删除L中的第loc个元素*******/ 
printf("请输入要删除元素的位置:\n");
scanf("%d",&loc);
while(loc != 999){
ListDelete_Sq(L,loc,e1);
printf("删除元素的值为:%d \n",*e1);
printf("删除元素的位置Loc:\n");
scanf("%d",&loc);
}
/*******END*******/ 
ListTraverse(L);

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息