单链表的定义和表示

  • 单链表的存储结构
typedef struct Lnode{
ElemType    data;
struct    Lnode   *next;
}Lnode,*LinkList

单链表的定义和表示_第1张图片

  • 单链表的初始化
    (1)生成新节点作头结点,用头指针L指向头结点
    (2)将头结点的指针域置空。

算法描述

Status InitList_L(LinkList &L){
  	L=new LNode;
  	L->next=NULL;
  	return OK;
}
  • 判断链表是否为空:
    空表就是链表中无元素,但是头指针和头结点依然存在
    思路:判断头结点指针域是否为空
int ListEmpty(LinkList L){
	if(L->next)
		return 0;
	else
		return 1;
}

若L为空表,则返回1,否则返回0。

  • 单链表的销毁
    思路:从头指针开始,依次释放所有节点
Status DestroyList_L(LinkList &L){
	Lnode *p;
	while(L){
		p=L;
		L=L->next;
		delete p;
	}
}
  • 清空链表
    链表还存在,但链表中没有元素
    思路:依次释放所有节点,并将头结点指针域置为空
Status ClearList(LinkList &L){
	Lnode *p,*q;
	p=L->next;
	while(p){
		q=p->next;
		delete p;
		p=q;
	}
	L->next=NULL;
	return OK;
}
  • 求单链表L的表长
int ListLength_L(LinkList L){
	LinkList p;
	p=L-next;
	i=0;
	while(p){
		i++;
		p=p->next;
	}
}
  • 取值——取单链表中第i个元素的内容
    链表不是随机存取结构,所以需要逐个节点往下搜索。
    算法步骤:
  1. 从第1个节点(L->next)顺链扫描,用指针p指向当前扫描到的节点,p初值p=L->next。
  2. j做计数器,累计当前扫描过的节点数,j初值为1
  3. 当p指向扫描到的下一节点时,计数器j加1。
Status GetElem_L(LinkList L, int i, ElemType &e){
	p=L->next;   j=1;
	while(p&&jnext;++j;
	}
	if(!p||j>i)
		return ERROR;
	e=p->data;
	return OK;
}
  • 插入节点
    在第i个节点前插入值为e的新节点
    算法示意图:
    单链表的定义和表示_第2张图片
    代码:
Status ListInsert_L(LinkList &L,int i, ElemType e){
	p=L;j=0;
	while(p&&jnext;++j;
	}
	if(!p||j>i-1)
		return ERROR;
	s=new LNode;
	s->data=e;
	s->next=p->next;
	p->next=s;
	return OK;
}
  • 删除节点

单链表的定义和表示_第3张图片

你可能感兴趣的:(数据结构)