#include<stdio.h>
#include <stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//单链表初始化
bool InitList(LinkList &L){
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
return true;
}
//求表长操作
int length(LinkList L){
int len=0;
LNode *p=L;
while(p->next!=NULL){
p=p->next;
len++;
}
return len;
}
//按序号查找结点
LNode *GetElem(LinkList L,int i){
LNode *p=L;
int j=0;
while(p!=NULL&&j<i){
p=p->next;
j++;
}
return p;
}
//按值查找表节点
LNode *LocateElem(LinkList L,int e){
LNode *p=L->next;
while(p!=NULL&&p->data!=e)
p=p->next;
return p;
}
//插入节点操作(后插)
bool ListInsert(LinkList &L,int i,int e){
LNode *p=L;
int j=0;
while(p!=NULL&&j<i-1){//找到要插入的位置的前一个节点
p=p->next;
j++;
}
if(p==NULL)//i值不合法
return false;
LNode *s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
//删除节点操作
bool ListDelete(LinkList &L,int i,int &e){
LNode *p=L;
int j=0;
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}
if(p==NULL&&p->next==NULL)
return false;
LNode *q=p->next;
e=q->data;
p->next=q->next;
free(q);
return true;
}
//打印单链表
void PrintList(LinkList L){
LNode *p=L->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int main(){
int e;
LinkList L;
InitList(L);
ListInsert(L,1,1);
ListInsert(L,2,2);
ListInsert(L,3,3);
ListInsert(L,4,4);
ListInsert(L,5,5);
PrintList(L);
printf("表长为%d\n",length(L));
printf("第2个节点的值为%d\n",GetElem(L,2)->data);
printf("值为3的节点的值为%d\n",LocateElem(L,3)->data);
ListDelete(L,3,e);
PrintList(L);
}
运行结果:
1 2 3 4 5
表长为5
第2个节点的值为2
值为3的节点的值为3
1 2 4 5