1链表概念
链表是线性表的链式存储方式,逻辑上相邻的数据在计算机内的存储位置不相邻,可以给每个元素附加一个指针域,指向下一个存储位置,如图所示:
2链表的要素
一个链表的节点包括两个部分组成 1 数据域: 储存数据 2 指针域: 指向下一个节点的内存地址
单链表的结构: 双链表的结构(此章节不细说):
单链表的结构体的定义:
typedef struct LinkNode
{
int data;
struct LinkNode *next;
}LinkNode, LinkList;
3单链表的算法实现
(1)单链表的初始化
typedef struct _LinkNode_
{
int data;
struct LinkNode *next;
}LinkNode, LinkList;
bool InitList(LinkList* &L)
{
L=new LinkNode;
if(!L)return false;
L->next=NULL;
return true;
}
(2)单链表增加元素
<1>前插法
bool ListInsert_front(LinkList* &L, LinkNode * node)
{
if(!L || !node ) return false;
node->next = L->next;
L->next = node;
return true;
}
<2>尾插法
bool ListInsert_back(LinkList* &L, LinkNode *node)
{
LinkNode *last = NULL;
if(!L || !node ) return false;
last = L;
while(last->next) last=last->next;
node->next = NULL;
last->next = node;
return true;
}
<3>任意位置插法
bool LinkInsert(LinkList* &L, int i, int &e)
{
int j;
LinkList *p, *s;
p=L;
j=0;
while (p&&j<i-1)
{
p=p->next;
j++;
}
if (!p || j>i-1)
{
return false;
}
s=new LinkNode;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
(3)单链表的遍历
void LinkPrint(LinkList* &L)
{
LinkNode* p;
p=L->next;
while (p)
{
cout <<p->data <<"\t";
p=p->next;
}
cout<<endl;
}
(4)单链表的获取元素
bool Link_GetElem(LinkList* &L, int i, int &e)
{
int j;
LinkList* p;
p=L->next;
j=1;
while (j<i && p)
{
p=p->next;
j++;
}
if (!p || j>i)
{
return false;
}
e=p->data;
return true;
}
(5)单链表的查找元素
bool Link_FindElem(LinkList *L, int e)
{
LinkList *p;
p=L->next;
while (p && p->data!=e)
{
p=p->next;
}
if(!p)return false;
return true;
}
(6)单链表的删除元素
bool LinkDelete(LinkList* &L, int i)
{
LinkList *p, *q;
int j;
p=L;
j=0;
while((p->next)&&(j<i-1))
{
p=p->next; j++;
}
if (!(p->next)||(j>i-1))
return false;
q=p->next;
p->next=q->next;
delete q;
return true;
}
(7)单链表的销毁
void LinkDestroy(LinkList* &L)
{
LinkList *p = L;
cout<<"销毁链表!"<<endl;
while(p)
{
L=L->next;
cout<<"删除元素: "<<p->data<<endl;
delete p;
p=L;
}
}
[奇牛学院]
|