//方法1:
typedef struct Lnode*pointer;
struct LNode
{
ElemType data;//数据域
pointer next;//指针域
};
typedef pointer LinkList;
//方法2:
typedef struct LNode
{
ElemType data;//数据域
structLNode *next;//指针域
}LNode*LinkList;//LNode(结构体了类型),LinkList(结构体指针类型)都是类型名
2.单链的查询操作
- 按序号进行查找
//按序号查找(单链表)
Status GetElem_Lk(LinkList L,int i,ElemType &e)
//在带头结点的单链表L中查找第i个元素
{
p = L->next;j = 1;
while(p != NULL && j<i)
{
p = p->next;
j++;
}
if(p == NULL || j>i)
return ERROR;
e = p->data;
return OK;
}
- 按元素值进行查找
LNode *LocateElem_Lk(LinkList L,ElemType x)
//在带头结点的单链表L中查找值为x的元素
{
p = L->next;
while(p != NULL && p->data != x)
p = p->next;
return p;
}
3.单链表的插入操作
Status Insert_L(LinkList &L,int i,ElemType x)
{
P = L;j = 0;
while(p != NULL && j<i-1)
{
p = p->next;
j++;
}
if(p == NULL || j>i-1)
return ERROR;
s = new LNode;//申请结点空间
s->data = x;
s->next = p->next;
p->next = s;
return OK;
}
4.单链表的删除
Status Delete_L(LinkList &L,int i,ElemType &x)
{
p = L;j = 0;
while(p->next != NULL && j<i-1)
{
p = p->next;
j++;
}
if(p->next == NULL || j>i-1)
return ERROR;
s = p->next;//s指向被删除结点
p->next = s->next;//修改被删除结点前驱指针域的值
x = s->data;//将被删除结点的值保存到变量x中
delete s;//释放被删除结点的空间
return OK;
}
5.创建单链表
//前插法创建单链表
void Create_L_F(LinkList &L,int n)
//逆序输入n个元素的值,建立带头结点的单链表L
{
L = new LNode;//申请结点空间作为单链表的表头结点
L->next = NULL;//将表头结点的指针域置空
for(i = 1;i <= n;i++)
{
cin>>x;//输入元素x
s->data = x;//将x存入s结点中
s->next = L-next;L->next = s;//将s插入到表头
}
}
//后插法创建单链表
void Create_L_L(LinkList &L,int n)
//顺序插入n个元素的值,建立带头结点的单链表L
{
L = newLNode;//申请结点空间
L->next = NULL;//将表头结点的指针域置空
r = L;//尾指针r指向头结点
for(i = 1;i <= n;i++)
{
cin>>x;//输入元素s
s->data = x;//将x存入s结点中
s->next = NULL;r->next = s;//将s插入到表尾
r = s;//r指向新的尾结点
}
}
6.循环链表的定义
//头尾指针
void join1(CLinkList &L1,CLinkList L2)
{
p = L1;
while(p->next != L1)//n次
p = p->next;
p->next = L2->next;
while(p->next != L2)//m次
p = p->next;
p->next = L1;
delete L2;
}
时间复杂度为O(m+n)
//两个尾指针的算法
void union1(CLinkList &r1,CLinkList r2)
{
L1 = r1->next;
L2 = r2->next;
r1->next = L2->next;
r2->next = L1;
delete L2;
r1 = r2;
}
时间复杂度为O(1)
7.双向链表的存储结构
typedef struct DLNode{
ElemType data;
struct DLNode *prior;
struct DLNode *next;
}DLNode,*DLinkList;