#include <bits/stdc++.h>
using namespace std
;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define ERROR -1
typedef int ElemType
;
typedef struct {
ElemType
*elem
;
int length
;
int listsize
;
}SqList
;
typedef int status
;
status
InitList(SqList
&L
)
{
L
.elem
=(ElemType
*)malloc(LIST_INIT_SIZE
*sizeof(ElemType
));
if(!L
.elem
) exit(OVERFLOW
);
L
.length
=0;
L
.listsize
=LIST_INIT_SIZE
;
return OK
;
}
status
DestroyList(SqList
&L
)
{
free(L
.elem
);
L
.elem
=NULL;
L
.length
=0;
L
.listsize
=0;
return OK
;
}
status
ClearList(SqList
&L
)
{
L
.length
=0;
return OK
;
}
status
ListEmpty(SqList L
)
{
if(L
.length
==0)
return true;
else
return false;
}
status
ListLength(SqList L
)
{
return L
.length
;
}
status
GetElem(SqList L
,int i
,ElemType
&e
)
{
if((i
<1)||(i
>L
.length
)) return ERROR
;
e
=L
.elem
[i
-1];
return e
;
}
status
LocateElem(SqList L
,ElemType e
,status
(*compare
)(ElemType
,ElemType
)){
int i
=1;
ElemType
*p
=L
.elem
;
while(i
<=L
.length
&&!compare(*p
++,e
))
++i
;
if(i
<=L
.length
)return i
;
else return 0;
}
status
compare(ElemType c1
,ElemType c2
){
if(c1
==c2
*c2
)return true;
else return false;
}
status
PriorElem(SqList L
,ElemType cur_e
,ElemType
&pre_e
)
{
int i
=2,*p
=L
.elem
+1;
while(i
<=L
.length
&&*p
!=cur_e
)
{
i
++;
p
++;
}
if(i
>L
.length
)
return ERROR
;
else
{
pre_e
=*(p
-1);
return OK
;
}
}
status
NextElem(SqList L
,ElemType cur_e
,ElemType
&next_e
)
{
int i
=1,*p
=L
.elem
;
while(i
<L
.length
&&*p
!=cur_e
)
{
i
++;
p
++;
}
if(i
==L
.length
)
return ERROR
;
else
{
next_e
=*(p
+1);
return OK
;
}
}
status
ListInsert(SqList
&L
,int i
,ElemType e
)
{
if(i
<1||i
>L
.length
+1) return ERROR
;
if(L
.listsize
<L
.length
+1)
{
ElemType
*newbase
;
newbase
=(ElemType
*)realloc(L
.elem
,(L
.listsize
+LISTINCREMENT
)*sizeof(ElemType
));
if(!newbase
)exit(OVERFLOW
);
L
.elem
=newbase
;
L
.listsize
+=LISTINCREMENT
;
}
ElemType
*q
,*p
;
q
=&L
.elem
[i
-1];
for (p
=&L
.elem
[L
.length
-1];q
<=p
;p
--)
{
*(p
+1)=*p
;
}
*q
=e
;
L
.length
++;
return OK
;
}
status
ListDelete(SqList
&L
,int i
,ElemType
&e
)
{
if(i
<1||i
>L
.length
+1) return ERROR
;
ElemType
*q
,*p
;
p
=&(L
.elem
[i
-1]);
e
=*p
;
q
=&(L
.elem
[L
.length
]);
for (;p
<q
;p
++)
{
*p
=*(p
+1);
}
L
.length
--;
return OK
;
}
void ListTraverse(SqList L
)
{
int i
;
printf("顺序表遍历:");
for(i
= 0; i
< L
.length
; i
++)
{
printf("%d ",L
.elem
[i
]) ;
}
printf("\n");
}
int main()
{
int j
,k
,i
;
ElemType e
,e0
;
SqList L
;
printf("初始化前,L.length=%d,L.listsize=%d,L.elem=%u\n",L
.length
,L
.listsize
,L
.elem
);
InitList
(L
);
printf("初始化后,L.length=%d,L.listsize=%d,L.elem=%u\n",L
.length
,L
.listsize
,L
.elem
);
for(j
=1;j
<=5;j
++){
ListInsert(L
,1,j
);
}
printf("头插法插入结果:");
for(j
=1;j
<=5;j
++){
printf("%d ",*(L
.elem
+j
-1));
}
printf("\n");
ListTraverse(L
);
j
=ListEmpty(L
);
printf("清空前,L.length=%d,L.listsize=%d,L.elem=%u\n",L
.length
,L
.listsize
,L
.elem
);
printf("j为1为空,j=%d\n",j
);
ClearList
(L
);
j
=ListEmpty(L
);
printf("清空后,L.length=%d,L.listsize=%d,L.elem=%u\n",L
.length
,L
.listsize
,L
.elem
);
printf("j为1为空,j=%d\n",j
);
for(j
=1;j
<=10;j
++){
ListInsert(L
,j
,j
);
}
printf("尾插法插入结果:");
for(j
=1;j
<=10;j
++){
printf("%d ",*(L
.elem
+j
-1));
}
printf("\n插入后,L.length=%d,L.listsize=%d,L.elem=%u\n",L
.length
,L
.listsize
,L
.elem
);
ListInsert(L
,1,0);
ListTraverse(L
);
printf("插入后,L.length=%d,L.listsize=%d,L.elem=%u\n",L
.length
,L
.listsize
,L
.elem
);
printf("第五个元素值为%d\n",GetElem(L
,5,e
));
for(j
=3;j
<=4;j
++){
k
=LocateElem(L
,j
,compare
);
if(k
)printf("第%d个元素的值为%d\n",k
,j
*j
);
else
printf("没有值为%d的元素\n",j
*j
);
}
for(j
=1;j
<=2;j
++){
GetElem(L
,j
,e0
);
i
=PriorElem(L
,e0
,e
);
if(i
==ERROR
)printf("元素%d无前驱\n",e0
);
else printf("元素%d的前驱为%d\n",e0
,e
);
}
for(j
=ListLength(L
)-1;j
<=ListLength(L
);j
++){
GetElem(L
,j
,e0
);
i
=NextElem(L
,e0
,e
);
if(i
==ERROR
)printf("元素%d无后继\n",e0
);
else printf("元素%d的后继为%d\n",e0
,e
);
}
i
=ListDelete(L
,5,e
);
if(i
==ERROR
)printf("删除第5个元素失败\n");
else printf("删除第5个元素成功,其值为%d\n",e
);
i
=ListDelete(L
,12,e
);
if(i
==ERROR
)printf("删除第12个元素失败\n");
else printf("删除第12个元素成功,其值为%d\n",e
);
ListTraverse(L
);
DestroyList(L
);
printf("销毁L后,L.length=%d,L.listsize=%d,L.elem=%u\n",L
.length
,L
.listsize
,L
.elem
);
return 0;
}
运行结果:
初始化前,L
.length
=4257081,L
.listsize
=0,L
.elem
=1
初始化后,L
.length
=0,L
.listsize
=100,L
.elem
=1793376
头插法插入结果:
5 4 3 2 1
顺序表遍历:
5 4 3 2 1
清空前,L
.length
=5,L
.listsize
=100,L
.elem
=1793376
j为
1为空,j
=0
清空后,L
.length
=0,L
.listsize
=100,L
.elem
=1793376
j为
1为空,j
=1
尾插法插入结果:
1 2 3 4 5 6 7 8 9 10
插入后,L
.length
=10,L
.listsize
=100,L
.elem
=1793376
顺序表遍历:
0 1 2 3 4 5 6 7 8 9 10
插入后,L
.length
=11,L
.listsize
=100,L
.elem
=1793376
第五个元素值为
4
第
10个元素的值为
9
没有值为
16的元素
元素
0无前驱
元素
1的前驱为
0
元素
9的后继为
10
元素
10无后继
删除第
5个元素成功,其值为
4
删除第
12个元素失败
顺序表遍历:
0 1 2 3 5 6 7 8 9 10
销毁L后,L
.length
=0,L
.listsize
=0,L
.elem
=0
--------------------------------
Process exited after
0.1572 seconds with
return value
0
请按任意键继续
. . .
转载请注明原文地址:https://blackberry.8miu.com/read-10140.html