#include <bits/stdc++.h>
#define OK 1
#define ERROR 0
using namespace std
;
typedef int ElemType
;
typedef int Status
;
typedef struct LNode
{
ElemType data
;
struct LNode
*next
;
}Lnode
,*LinkList
;
Status
InitList(LinkList
&L
){
L
=(LinkList
)malloc(sizeof(LNode
));
if(!L
){
exit(OVERFLOW
);}
L
->next
=NULL;
return OK
;
}
Status
GetElem(LinkList L
,int i
,ElemType
&e
){
LinkList p
=L
->next
;
int j
=1;
while(j
<i
&&p
){
p
=p
->next
;
j
++;
}
if(!p
||j
>i
)
return ERROR
;
e
=p
->data
;
return OK
;
}
Status
ListInsert(LinkList
&L
,int i
,ElemType e
){
LinkList p
=L
,s
;
int j
=0;
while(j
<i
-1&&p
){
j
++;
p
=p
->next
;
}
if(j
>i
-1||!p
){
return ERROR
;
}
s
=(LinkList
)malloc(sizeof(LNode
));
s
->data
=e
;
s
->next
=p
->next
;
p
->next
=s
;
return OK
;
}
Status
ListDelete(LinkList
&L
,int i
,ElemType e
){
LinkList p
=L
;
int j
=0;
while(j
<i
-1&&p
->next
){
p
=p
->next
;
j
++;
}
if(j
>i
-1||(!p
->next
)){
return ERROR
;
}
LinkList q
;
q
=p
->next
;p
->next
=q
->next
;
e
=q
->data
;
free(q
);
return OK
;
}
Status
LinkSearch(LinkList L
,ElemType key
,LNode
*e
){
LinkList p
=L
;
while(p
->next
&&p
->next
->data
!=key
){
p
=p
->next
;
}
if(!p
->next
)return ERROR
;
e
=p
->next
;
return OK
;
}
Status
LinkPiror(LinkList L
,ElemType cur_e
,ElemType
&e
){
LinkList p
=L
->next
;
while(p
->next
){
if(p
->next
->data
==cur_e
){
e
=p
->data
;
return OK
;
}
p
=p
->next
;
}
return ERROR
;
}
Status
LinkNext(LinkList L
,ElemType cur_e
,ElemType
&e
){
LinkList p
=L
->next
;
while(p
->next
){
if(p
->data
==cur_e
){
e
=p
->next
->data
;
return OK
;
}
p
=p
->next
;
}
return ERROR
;
}
void DestroyList(LinkList
&L
){
LinkList q
;
while(L
){
q
=L
->next
;
free(L
);
L
=q
;
}
}
void ClearList(LinkList L
){
LinkList p
=L
->next
;
L
->next
=NULL;
DestroyList(p
);
}
void ListEmpty(LinkList L
){
int k
;
if(L
->next
==NULL)k
=1;
else k
=0;
if(k
==1)
printf("表为空\n") ;
else
printf("表不为空\n");
}
int ListLength(LinkList L
){
int i
=0;
LinkList p
=L
->next
;
while(p
){
i
++;
p
=p
->next
;
}
return i
;
}
void CreateListHead(LinkList
&L
,int n
){
LinkList p
;
int i
;
InitList(L
);
for(i
=0;i
<n
;i
++){
p
=(LinkList
)malloc(sizeof(LNode
));
cin
>>p
->data
;
p
->next
=L
->next
;L
->next
=p
;
}
}
void CreateListTail(LinkList
&L
,int n
){
LinkList p
,r
;
int i
;
InitList(L
);
r
=L
;
for(i
=0;i
<n
;i
++){
p
=(LinkList
)malloc(sizeof(LNode
));
cin
>>p
->data
;
r
->next
=p
;
r
=r
->next
;
}
p
->next
=NULL;
}
void show(LinkList L
){
LinkList p
=L
->next
;
while(p
!=NULL){
printf("%d ",p
->data
);
p
=p
->next
;
}
cout
<<endl
;
}
int main()
{
LinkList L
;
ElemType e
,e0
;
int i
,j
,k
;
InitList
(L
);
cout
<<"请输入待插入链表的5个数"<<endl
;
CreateListHead(L
,5);
show(L
);
ListEmpty(L
);
printf("%d\n",ListLength(L
));
ClearList(L
);
ListEmpty(L
);
printf("%d\n",ListLength(L
));
DestroyList(L
);
cout
<<"请输入待插入链表的5个数"<<endl
;
CreateListTail(L
,5);
show(L
);
ListInsert(L
,2,9);
show(L
);
ClearList(L
);
for(j
=1;j
<=10;j
++){
ListInsert(L
,1,j
);
}
show(L
);
for(j
=1;j
<=2;j
++){
GetElem(L
,j
,e0
);
i
=LinkPiror(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
=LinkNext(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
);
DestroyList(L
);
printf("销毁L后,L=%u\n",L
);
return 0;
}
结果:
请输入待插入链表的
5个数
1 2 3 4 5
5 4 3 2 1
表不为空
5
表为空
0
请输入待插入链表的
5个数
5 4 3 2 1
5 4 3 2 1
5 9 4 3 2 1
10 9 8 7 6 5 4 3 2 1
元素
10无前驱
元素
9的前驱为
10
元素
2的后继为
1
元素
1无后继
删除第
5个元素成功,其值为
1
删除第
12个元素失败
销毁L后,L
=0
转载请注明原文地址:https://blackberry.8miu.com/read-39890.html