#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int Status ;
typedef int ElementType ;
/*--------线性表的数组表示方式--------------*/
typedef struct {
ElementType * elem ;
int length ;
int listSize ;
}SqList;
/*--------------构造空的链表--------------*/
Status InitList_sql(SqList &l){
//构造一个空的线性表
l.elem =(ElementType*) malloc(LIST_INIT_SIZE*sizeof(ElementType));
if(!l.elem) exit(OVERFLOW);
//线性表元素的个数
l.length = 0;
//线性表的空间大小
l.listSize= LIST_INIT_SIZE ;
return OK ;
}
/*--------------插入-------------------*/
/*
在第i个元素之前插入元素 elem
*/
Status insert(SqList &l,int i ,ElementType elem){
//插入位置不正确
if(i<1|| i> l.listSize+1) return ERROR ;
if(l.length>=l.listSize){//线性表空间已满
//此时开辟空间
ElementType *newBase = (ElementType*) realloc(l.elem,(l.listSize+LISTINCREMENT)*sizeof(ElementType));
if(!newBase) exit(OVERFLOW); //分配地址失败
l.elem = newBase ; //新的基址
l.listSize += LISTINCREMENT ;//增加存储容量
}
ElementType *q = &(l.elem[i-1]); //插入元素的位置
ElementType *p ;
for(p=&l.elem[l.length-1];p>=q;p--){
*(p+1)=*p ;
}
l.elem[i-1] = elem ;
++l.length ;
return OK ;
}
/*----------删除列表中某一位置上的元素------------*/
/*
删除链表第i个位置上的元素,并且返回此元素的值
*/
Status Delete(SqList &l,int i,ElementType &elem){
if(i<1||i>l.length)return ERROR ; //删除的位置不合法
ElementType *delEle = &(l.elem[i-1]) ;
ElementType e = *delEle ;
for(*delEle; *delEle<l.length;delEle++){
*(delEle-1)=*delEle ;
}
--l.length ;
return OK;
}
/*------------打印链表---------------------*/
Status List(SqList &l){
ElementType i;
for(i=0 ;i<l.length;i++){
printf("%d\t",l.elem[i]);
}
return OK ;
}
void main(){
SqList l ;
if(InitList_sql(l))
printf("初始化链表成功!\n");
int i ;
for(i=0;i<10;i++){ //循环插入数据
insert(l,i+1, i);
}
List(l);
printf("删除之后的链表数据为:\n");
int elem ;
Delete(l,3, elem);
List(l);
}
数据结构线性表的动态顺序实现增删改查
最新推荐文章于 2022-07-11 21:54:09 发布