在考研开始复习数据结构时用C++实现了单链表的一些基础操作
建议考研用书王道数据结构
#include<iostream>
#define ElemType int
using namespace std;
//单链表节点
struct List{
ElemType value;
List *next;
};
//初始化
List *InitList(List *L){ //初始化一个头结点的好处就是L始终不变,L->next一直在变
L=(List*)malloc(sizeof(List));
L->value=0;
L->next=NULL;
return L;
}
//追加节点
void AppendList(List *L,ElemType e){
while(L->next)
L=L->next;
List *newL=(List*)malloc(sizeof(List));
newL->value=e;
newL->next=NULL;
L->next=newL;
}
//定位第i个节点的位置,因为在查找、删除、插入的时候都用到定位
List *GetNodeAddr(List *L,int i){
int j=0;
while(L){
if(j==i){
return L;
}
else{
L=L->next;
j++;
}
}
return NULL;
}
//查找
int FindbyId(List *L,int i){
List *p=GetNodeAddr(L,i);
return p->value;
}
//删除节点
void DeleteNode(List *L,int i)
{
List *p1=GetNodeAddr(L,i-1);
List *p2=p1->next;
if(p2->next!=NULL)
p1->next=p2->next;
else
p1->next=NULL;
delete p2;
}
//在第i个节点前插入节点
void InsertNode(List *L,int i,ElemType e){
List *newL=(List*)malloc(sizeof(List));
newL->value=e;
List *p=GetNodeAddr(L,i-1);
List *q=p->next;
p->next=newL;
newL->next=q;
}
//判空
bool IsEmpty(List *L){
return (L->next==NULL)?true:false;
}
//返回链表长度
int Length(List *L){
int i=0;
while(L->next){
i++;
L=L->next;
}
return i;
}
//清空链表
void ClearList(List *L)
{
int length=Length(L);
for(int i=1;i<=length;i++)
DeleteNode(L,i);
}
int main(){
List *L,*L1;
L=InitList(L1);
AppendList(L,1);
AppendList(L,2);
InsertNode(L,2,5);
AppendList(L,3);
//cout<<FindbyId(L,2)<<endl;
//DeleteNode(L,1);
List *head=L->next;
while(head){
cout<<head->value;
if(head->next)
cout<<"--->";
head=head->next;
}
cout<<endl;
cout<<Length(L);
return 0;
}