线性表---顺序表
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);
}
#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);
}
相关文章推荐
- C语言实现顺序表基本操作汇总
- java线性表排序示例分享
- c语言实现顺序表的基本操作
- php线性表的入栈与出栈实例分析
- C++语言实现线性表之数组实例
- C语言线性表的顺序表示与实现实例详解
- C++语言实现线性表之链表实例
- 简单介绍线性表以及如何实现双链表
- Go语言实现顺序存储的线性表实例
- 利用线性表的顺序结构求集合的并、交、差、补(C语言实现)
- 结构之美:定义一个线性表
- 结构之美:线性表的查找、插入与删除操作
- 线性表的概念、结构与基本操作
- 结构之美:线性表的链式存储结构——链表
- 线性表的几个链式储存结构介绍
- 数据结构_线性表
- 深入分析 Linux 内核链表
- 第03话:线性表的顺序存储结构
- 第02话:线性表的抽象数据类型ADT定义
- 第01话:线性表的概念与定义