首页 > 代码库 > 《数据结构与算法分析》学习笔记(三)——链表ADT
《数据结构与算法分析》学习笔记(三)——链表ADT
今天简单学习了下链表,待后续,会附上一些简单经典的题目的解析作为学习的巩固
首先要了解链表,链表其实就是由一个个结点构成的,然后每一个结点含有一个数据域和一个指针域,数据域用来存放数据,而指针域则用来存放下一个结点的地址。
1、先给出结点的定义。
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
struct Node
{
ElementType Element;
Position next;
};
2、下面就是一些常见的链表的操作
List init(List L);
int IsEmpty(List L);
int IsLast(Position P,List L);
Position Find(ElementType X,List L);
void Delete(ElementType X,List L);
Position FindPrevious(ElementType X,List L);
void Insert(ElementType X,List L,Position P);
void DeleteList(List L);
Position Header(List L);
Position First(List L);
void Print(List L);
3、具体每个的分析啦
List init(List L)
{
L=new struct Node;
L->next =nullptr;
return L;
}
这个是初始化链表,链表默认有一个空的头指针,不用来存放数据,只是用来处理一些特殊的情况,个人认为一个结点的代接换取代码的简洁是很好的选择,
int IsEmpty(List L)
{
return L->next==nullptr;
}
这个是判断链表是否为空。
Position Find(ElementType X,List L)
{
Position p;
p=L->next;
while (p!=nullptr&&p->Element!=X )
{
p=p->next;
}
return p;
}
由于链表跟指针不同,没有下标可以直接访问,所以我们需要一个个的遍历。
int IsLast(Position P,List L)
{
Position p;
p=L->next;
if (p->next!=nullptr)
{
p=p->next;
}
return p==P;
}
判断是否是最后一个。
void Delete(ElementType X,List L)
{
Position p,tempCell;
p=FindPrevious(X,L);
if(!IsLast(p,L))
{
tempCell=p->next;
p->next=tempCell->next;
delete tempCell;
}
}
删除的话重点是别忘记释放内存
Position FindPrevious(ElementType X,List L)
{
Position p;
p=L;
while (p->next!=nullptr&&p->next->Element!=X)
{
p=p->next;
}
return p;
}
与查找相关
//Insert(after legal Position P)
void Insert(ElementType X,List L,Position P)
{
Position tempCell;
tempCell = new struct Node;
if (tempCell==nullptr)
{
cout<<("Out of space!!")<<endl;
}
tempCell->Element=X;
tempCell->next = P->next;
P->next=tempCell;
}
默认插入在结点的后面
void DeleteList(List L)
{
Position p;
p=L->next;
L->next=nullptr;
while (p!=nullptr)
{
Position pTemp=p->next;
delete p;
p=pTemp;
}
}
清空链表
void Print(List L)
{
Position p;
p=L->next;
while(p!=nullptr)
{
cout << p->Element.coe << p->Element.index <<" “;
p=p->next
}
cout<<endl;
}
打印链表