/*
一、数据结构书上对程序ArryList.c的某些定义
1.线性表的顺序存储结构
2.特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中任一元素。它的存储位置可用一个简单、直观的公式来表示。但这个特点也铸成了这种存储结构
的弱点:在作插入和删除操作时,需要移动大量元素。
二、写ArryList.c的目的:
1.提升写代码能力
2.体现存储不一样,操作也就不一样。本文件为连续存储,比如删除一个元素后,其他地方的元素都要跟着移位置才行,而离散存储就不一样,不要都移动。
3.泛型存储不一样,操作也一样。因为内部是通过C++的一个模版内部实现了,导致外部看起来的效果一样。这样才能很好地理解泛型。
4.注意广义算法与狭义算法,比如冒泡法排序,广义的算法就是指冒泡法,排序的方法,对于连续存储和离散存储都一样。而狭义的算法来说,连续存储和离散存储就不一样了,也
就是操作不一样。我认为,数组构建简单,操作起来较复杂,链表构建起来复杂,但有时操作起来简单。
*/
#include "ArrayList.h"
void init_arraylist(struct arrayList * pArr,int lengh)
{
pArr->pBase=(int *)malloc(sizeof(int)*lengh);
if( NULL == pArr->pBase)
{
printf("init_arraylist():malloc err!\n");
exit(-1);
}
else
{
pArr->len = lengh;
pArr->cnt = 0;
}
return;//编程风格,告诉其他人员此函数已结束
}
int isEmpty(struct arrayList * pArr)
{
if( 0 == pArr->cnt )
return 1;
else
return 0;
}
int isFull(struct arrayList * pArr)
{
if( pArr->cnt == pArr->len )
return 1;
else
return 0;
}
void showArrayList(struct arrayList * pArr)
{
int i=0;
if( 1 == isEmpty(pArr) )
{
printf("showArrayList():arrayList is empty!\n");
exit(-1);
}
for(i=0;i<pArr->len;i++)
printf("pArr->pBase[%d]=%d\n",i,pArr->pBase[i]);
return;
}
int addToEnd(struct arrayList * pArr,int val)
{
if( 1 == isFull(pArr) )
{
printf("addToEnd():arrayList is full!\n");
exit(-1);
}
pArr->pBase[pArr->cnt] = val;
pArr->cnt++;
return 1;
}
int deleteElement(struct arrayList * pArr,int pos,int *whichData)
{
int i=0;
if( 1 == isEmpty(pArr) )
{
printf("deleteElement():arrayList is empty!\n");
exit(-1);
}
if( pos < 1 || pos > pArr->cnt)
{
printf("deleteElement():position is err!\n");
exit(-1);
}
*whichData = pArr->pBase[pos-1];
for(i=pos;i<pArr->cnt+1;i++)
pArr->pBase[i-1] = pArr->pBase[i];
pArr->cnt--;
return 1;
}
int insertArrayList(struct arrayList * pArr,int pos,int val)
{
int i=0;
if( 1 == isFull(pArr) )
{
printf("insertArrayList():arrayList is full!\n");
exit(-1);
}
if( pos<1 || pos>pArr->cnt)
{
printf("insertArrayList():position is err!\n");
exit(-1);
}
for(i=pArr->cnt; i>pos-1; i--)
pArr->pBase[i] = pArr->pBase[i-1];
pArr->pBase[pos-1] = val;
pArr->cnt++;
return 1;
}
void inversionArrayList(struct arrayList * pArr)
{
int i=0,j=0,t=0;
for(i=0,j=pArr->cnt-1; i<j; i++,j--)
{
t = pArr->pBase[i];
pArr->pBase[i] = pArr->pBase[j];
pArr->pBase[j] = t;
}
return;
}
void sortArrayList(struct arrayList * pArr)
{
int i=0,j=0,t=0;
if( 1 == isEmpty(pArr) )
{
printf("sortArrayList():arrayList is empty!\n");
exit(-1);
}
for(i=0; i<pArr->cnt-1; i++)//冒泡法
for(j=i+1; j<pArr->cnt; j++)
if( pArr->pBase[i] > pArr->pBase[j] )//升序
{
t = pArr->pBase[j];
pArr->pBase[j] = pArr->pBase[i];
pArr->pBase[i] = t;
}
}
void freeArrayList(struct arrayList * pArr)
{
free(pArr->pBase);
pArr->pBase = NULL;
}
对应头文件:
#ifndef ARRAYLIST_H
#define ARRAYLIST_H
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
struct arrayList{
int * pBase;
int len;
int cnt;
};
void init_arraylist(struct arrayList * pArr,int lengh);
int isEmpty(struct arrayList * pArr);
int isFull(struct arrayList * pArr);
void showArrayList(struct arrayList * pArr);
int addToEnd(struct arrayList * pArr,int val);
int deleteElement(struct arrayList * pArr,int pos,int *whichData);
int insertArrayList(struct arrayList * pArr,int pos,int val);
void inversionArrayList(struct arrayList * pArr);
void sortArrayList(struct arrayList * pArr);
void freeArrayList(struct arrayList * pArr);
#endif
线性表的顺序存储结构(动态数组)
最新推荐文章于 2023-02-07 16:19:22 发布