第一节 线性表
一.线性表
线性表分为1.顺序线性表2.链式线性表(可包括1.循环链表2.双向链表)
下面以代码实现:
1.顺序线性表
//----线性表的动态分配顺序储存结构
#define LIST_INIT_SIZE 100 //线性表储存空间的初始分配量
#define LISTINCREMENT 10 //线性表储存空间的分配增量
type struct {
Elemtype *elem; //储存空间基地址
int length; //当前长度
int listsize; //当前分配的储存容量(以sizeof(Elemtype)为单位)
}Sqlist;
//----构造一个顺序线性表
Status InitSqlist(Sqlist L)
{
if(!(L.elem = (Elemtype*)malloc(listsize*sizeof(Elemtype))) exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
return ok;
}
//-----顺序线性表第i个位置中增添一个元素
Status ListInsert(Sqlist &L,int i,elemtype e)
{
if(i<1||i>length+1) return ERROR; //插入位置有误
if(L.length>=L.listsize) //线性表已满,需要增加储存空间
L.elem = (Elemtype*)realloc(L.elem,(L.listsize + LISTINCREMENT)*size of(elemtype));
if(!L.elem) return (OVERFLOW);
L.listsize + = LISTINCREMENT;
}
q=L.elem[ i-1];
for(p=L.elem[Length -1];q<=p;--p) *(p+1)=*p;// 插入位置及之后的元素后移
*q =e;
++L.length;
return ok;
}
//-----顺序线性表第i个位置中删除一个元素
Status ListDelete(Sqlist &L,int i elemtype e)
{
if((i<1)||(i>length)) return ERROR;
q=L.elem[ i-1];
e=*p;
for(p=L.elem[Length -1];q<=p;--p) *(p-1)=*p;// 插入位置及之后的元素后移
*q =e;
--L.length;
return OK;
}
2.链式线性表
//----线性表法的单链表储存结构----
typedef struct LNode
{
elemtype data;
struct LNode* next;
}LNode,*LinkList;
//----GetElem函数----
Status GetElem(LinkList L,int i,Elemtype e)
{
p=L->next; j=1;
while(p&&j<i)
{
p=p->next,++j;
}
if(!p||j>i) return ERROR;
e=p->data;
return OK;
}
//链式线性表的增添元素
Staus ListInsert(Linklist L,int i,elemtype e)
{
p=L,j=0;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1) return ERROR;
s=(LinkList)malloc(sizeof(Lnode));
s->data=e;
s->next =p->next;
p->next =s;
return ok;
}
//链式线性表的删除元素
Staus ListDelete(LinkList L, int i,elemtype e )
{
p=L,j=0;
while(p->next&&j<i-1)
{
p=p->next;
j++;
}
if(!(p->next)||j>i-1) return ERROR;
e=p->data;
q=p->next;
p->next=q->next;//后面补给前面的
free(q);
return ok;
}
//建立线性表
void createList(Linklist &L,int n)
{
L= (LinkList)malloc(sizeof(LNode));
L_>next =null;
for(i=n;i>0;i--)
{
P=(LinkList)malloc(sizeof(LNode));
scanf(&P->data);
p->next=L->next;
L->next=p;
}
}