#include <stdio.h>
#include <stdlib.h>
/**************************************************************************/
/* 抽象数据类型线性表基本操作*/
/* 1.InitList函数,初始化线性表,创建表头指针并置为NULL*/
/* 2.CreateList函数,创建线性表,此函数输入为负数则停止输入*/
/* 3.PrintList函数,遍历输出线性表*/
/* 4.DestroyList函数,销毁线性表释放内存空间*/
/* 5.ClearListt函数,清空线性表释放内存空间*/
/* 6.ListEmpty函数,判断若为空表返回OK,若为非空返回ERROR*/
/* 7.Listlength函数,返回线性表元素个数*/
/* 8.GetElem函数,返回线性表第i元素数据*/
/* 9.LocateElem函数,返回线性表第一个满足compare()函数的位序*/
/* 10.InsertList函数,插入线性表*/
/* 11.DeleteList函数,删除第i个元素*/
/* 12.ListTravers函数,对列表每个元素执行Vist()方法*/
/* 13 SortList函数,升序*/
/* 14 SortedList函数,降序*/
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
#define OK 1 //成功标志1
#define ERROR 0 //失败标志0
typedef int ElemType; //设置线性表保存数据类型
typedef struct {
ElemType *element; //当前存储空间基地址
int length; //当前长度
int listsize; //当前分配的存储容量,以sizeof(ElemType)为单位
}SqList,*SqLinkList;
/***************************初始化线性表***********************************/
void InitList(SqList *L){ //初始化构造一个空的线性表L,L为表头指针,L->element 指向线性表元素首地址
(*L).element=(ElemType *)malloc(LISTINCREMENT*sizeof(ElemType)); //分配初始存储空间
if(!(*L).element){ //内存分配失败,退出函数
printf("分配内存失败!\n");
return;
}
(*L).length=0; //设置线性表当前长度为0
(*L).listsize=LIST_INIT_SIZE; //线性表初始存储空间
}
/***************************创建线性表***********************************/
void CreateList(SqList *L){ //创建线性表,行参为之指针,函数方法改变指针所指地址的内容,则实参改变
ElemType ch; //接收输入的数据
int i=0;
printf("请输入数据: ");
scanf("%d",&ch);
getchar(); //消除回车键
while(ch>0){ //数据大于0为真,循环继续
if(L->length>=L->listsize){
L->element=(ElemType *)realloc(L->element,
(L->listsize+LISTINCREMENT)*sizeof(ElemType));//重新分配内存空间,大小增加LISTINCREMENT
if(!(*L).element){ //内存分配失败,退出函数
printf("分配内存失败!\n");
return;
}
L->listsize=L->listsize+LISTINCREMENT;
}
L->element[i++]=ch; //element[i]第i个地址的内容
L->length++;
printf("请输入数据: ");
scanf("%d",&ch); //重复输入数据
getchar(); //消除回车键
}
printf("数据输入完毕!\n");
}
/***************************遍历输出打印线性表***********************************/
void PrintList(SqList L){ //遍历打印线性表内容
if(L.length==0){
printf("线性表为空,打印失败!\n");
return;
}
printf("遍历线性表: ");
for(int i=0;i<L.length;i++){
printf("--%d--",L.element[i]);
}
printf("\n打印线性表完毕!\n");
}
/***************************销毁线性表***********************************/
int DestroyList(SqList *L){ //销毁线性表
free(L->element); //释放内存空间
L->element=NULL;
L->length=0;
L->listsize=0;
printf("销毁线性表成功!\n");
return OK;
}
/***************************清空线性表***********************************/
int ClearList(SqList *L){ //清空线性表
L->length=0;
return OK;
}
/***************************判断是否为空线性表***********************************/
int ListEmpty(SqList L){
if(L.length == 0)
return OK;
else
return ERROR;
}
/***************************返回线性表元素个数***********************************/
int ListLength(SqList L){
return L.length;
}
/***************************返回线性表第i个元素数据***********************************/
ElemType GetElem(SqList L,int i){
if(i<0 || i>=L.length){
printf("下标越界,返回失败!\n");
return ERROR;
}
else
return L.element[i];
}
/***************************返回线性表满足compare第1个元素位序***********************************/
int compare(ElemType e1,ElemType e2){
if(e1 == e2)
return OK;
else
return ERROR;
}
int LocateElem(SqList L,ElemType e,int compare(ElemType,ElemType)){
ElemType *p=L.element;
for(int i=0;i<L.length;i++){
if(compare(*p++,e))
return i;
}
return ERROR;
}
/***************************第i个位置插入元素e***********************************/
ElemType InsertList(SqList *L,int i,ElemType e){
if(i<0 || i>L->length){
printf("下标越界,插入失败!\n");
return ERROR;
}
for(int j=L->length;j!=i;j--){
L->element[j]=L->element[j-1];
}
L->element[i]=e;
L->length+=1;
return e;
}
/***************************删除第i个位置元素e***********************************/
ElemType DeleteList(SqList *L,int i){
ElemType e;
if(i<0 || i>=L->length){
printf("下标越界,删除失败!\n");
return ERROR;
}
e=L->element[i];
for(int j=i+1;j<L->length;j++){
L->element[j-1]=L->element[j];
}
L->length-=1;
return e;
}
/***************************线性表元素执行VistElem操作***********************************/
int VistElem(ElemType *e){
*e=(*e)*3;
return OK;
}
int ListTravers(SqList *L,int VistElem(ElemType *)){
int check;
for(int i=0;i<L->length;i++){
VistElem(L->element+i);
}
return OK;
}
/**************************升序***********************************/
int SortList(SqList *L){
int k;
for(int i=0;i<L->length-1;i++){
k=i+1;
for(int j=k;j<L->length;j++){
if(L->element[i]>L->element[j]){
L->element[i]=L->element[i]^L->element[j];
L->element[j]=L->element[i]^L->element[j];
L->element[i]=L->element[i]^L->element[j];
}
}
}
return OK;
}
/**************************降序***********************************/
int SortedList(SqList *L){
int k;
for(int i=0;i<L->length-1;i++){
k=i+1;
for(int j=k;j<L->length;j++){
if(L->element[i]<L->element[j]){
L->element[i]=L->element[i]^L->element[j];
L->element[j]=L->element[i]^L->element[j];
L->element[i]=L->element[i]^L->element[j];
}
}
}
return OK;
}
int main(){
SqList L;
ElemType ch,e;
int a[] = {1504,3,42,42,8,183,22,238,85,18,22,18,31};
InitList(&L);
//CreateList(&L);
PrintList(L);
ClearList(&L);
//DestroyList(&L);
for(int i=0;i<(sizeof(a)/sizeof(int));i++){
int cnt = rand()%(L.length+1);
printf("cnt=%d\n",cnt);
InsertList(&L,cnt,a[i]);
PrintList(L);
SortedList(&L);
PrintList(L);
}
printf("GetElem:\n");
/*for(int i=0;i<(sizeof(a)/sizeof(int));i++){
int cnt = rand()%(L.length+1);
ch=GetElem(L,cnt);
PrintList(L);
printf("a[%d]=%d\n",cnt,ch);
}
printf("\n");*/
/*for(int i=0;i<L.length;i++){
int cnt = rand()%(12);
e=a[cnt];
ch=LocateElem(L,e,compare);
printf("a[%d]=%d\n",ch,e);
}*/
/*printf("\n");
for(int i=L.length;i>0;i--){
int cnt = rand()%(L.length);
ch=DeleteList(&L,cnt);
printf("L=%d,a[%d]=%d\n",L.length,cnt,ch);
PrintList(L);
}
printf("\n");*/
/*for(int i=0;i<(sizeof(a)/sizeof(int));i++){
ListTravers(&L,VistElem);
PrintList(L);
}*/
printf("\n");
return 0;
}
C语言从零开始之数据结构与算法顺序线性表基本操作(1)
最新推荐文章于 2022-08-31 14:07:24 发布