前言:
本部分主要是有顺序表和链表,由于顺序表相对来说比较简单,而且其操作形式和链表也差不多,这里我重点学习链表,其中(带头结点的)单链表是基础,所以讲解较多,循环链表和双向链表简单涉及。
基本操作这里主要是(1)初始化(2)取值(3)查找(4)插入(5)删除(6)创建单链表。
一、单链表
首先有结构体定义
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
1.初始化
生成头结点,头结点指针域为空。
void InitList(LinkList &L){
L = new LNode;
L>next = NULL;
}
2.取值
用指针p指向首元节点,依次循环。
void GetElem(LinkList L, int i, ElemType &e){
p = L->next;j=1;
while(p&&j<1)
{
p = p->next;
++j;
}
if(!p||j>1) return 0;
e = p->data;
}
3.查找
用指针p指向首元节点,遍历表。
LNode *LocateElem(LinkList L, ElemType e){
p = L->next;
while(p&&p->data!=e){
p = p->next;
return p;
}
4.插入
查找节点ai-1并由指针p指向该节点,生成一个新节点*s的数据域为e。将新节点*s的指针域指向节点ai.将节点*p的指针域指向新节点*s。
void ListInsert(LinkList &L, int i, ElemType e){
p = L; j = 0;
while(p&&(j<i-1))
{
p = p->next;++j;}
if(!p||j>i+1) return 0;
s = new LNode;
s->data=e;
s->next = p->next;
p-next = s;
}
5.删除
查找节点ai-1并由指针p指向该节点,临时保存待删除节点ai的地址在q中,以备释放,将节点*p的指针域指向ai的直接后继节点,释放ai的空间。
void ListDelete(LinkList &L, int i)
{
p = L; j= 0;
while((p->next)&&(j<i-1))
{p = p->next; ++j;}
if(!(p->next)||(j>i-1)) return 0;
q = p-next;
p -next = q->next;
delete q;
}
6.创建单链表
1)前插法:创建一个只有头结点的空链表,根据待创建链表包括的元素个数,循环n次以下操作。
生成一个新节点*p,输入元素值赋给新节点的数据域,将新节点*p插入到头结点之后。
void CreateList_H(LinkList &L, int n)
{
L = new LNode;
L->next = NULL;
for(i=0;i<n;++i)
{
p = new LNode;
cin>>p->data;
p->next = L->next;
L-next = p;
}
}
2)后插法
void CreateList_R(LinkList &L, int n){
L = new LNode;
L->next = NULL;
r = L;
for(i=0;i<n;++i)
{
p = new LNode;
cin>>p->data;
p->next=NULL;
r=p;
}
}
二、循环链表
特点就是表中最后一个节点的指针域指向头结点,整个链表形成一个环。
三、双向链表
有如下形式
typedef struct DuLNode{
ElemType data;
struct DuLNode *prior;//前驱
struvt DuLNode *next;//后继
}DuLNode, *DuLinkList;
后记:
学习算法和数据结构,修炼内功耶,有什么不对的评论交流,谢谢。