线性表---顺序表

来源:互联网 发布:网络摄像头手机客户端 编辑:程序博客网 时间:2024/04/30 21:08
#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);
0 0
原创粉丝点击