[数据结构]:线性表之单链表.

1.单链表的存储结构:

//单链表的存储结构.
typedef struct Node
{
	ElemType data;      //数据域
	struct Node* Next;  //指针域
}Node;
typedef struct Node* LinkList;

2.初始化:构造一个空表.

算法步骤:                                                                                                                                     

1.生成新的结点作为头结点,用头指针L指向头结点.   2.头结点的指针域置空.

算法描述:

//初始化
Status InitList(LinkList L)
{
    L = new Node; //生成新节点作为头结点,用头指针指向头结点.
    L->Next = NULL;//头结点的指针域指空.
    return OK;
}

3.取值:

算法步骤:                                                                                                                                       

1.用指针p指向首元结点,用j做计数器初值赋为1. 2.从首元结点开始依次顺着链域next向下访问,只要指向当前结点的指针p不为空(NULL),并且没有到达序号为i的结点,则循环执行以下操作:  a: p指向下一结点;  b: 计数器j相应加一.  3.退出循环时,如果指针p为空,或者计数器j大于i,说明指定的序号i值不合法(i大于表长n或小于等于0),取值失败返回ERROR;否则取值成功,此时j=i时,p指向的结点就是要找的第i个结点,用参数e保存当前结点的数据域,返回OK.

算法描述:

//取值.
Status GetElem(LinkList L, int i, ElemType* e)
{
	int j;
	LinkList p;

	p = L->Next;           //初始化,p指向首元结点.
	j = 1;                 //计数器j初值赋为1.
	while (p && j < i)     //依次向后扫描,直到p为空或p指向第i个元素.
	{
		p = p->Next;        //p指向下一结点.
		++j;               //计数器j相应加一
	}
	if (!p || j > i)       //i值不合法i>n或i<=0.
	{
		return ERROR;
	}
	*e = p->data;           //取第i个结点的数据域.
	return OK;
}

4.查找:从链表的首元结点出发,依次将结点值和给定值e进行比较,返回查找结果.

算法步骤:                                                                                                                                   

1.用指针p指向首元结点.  2.从首元结点开始依次顺着链域next向下查找,只要当前结点的指针p不为空,并且p所指结点的数据域不等于给定值e,则循环执行以下操作:p指向下一结点.  3.返回p.若查找成功,p此时即为结点的地址值,若查找失败,p的值即为NULL.

算法描述:

//查找
Node* LocateElem(LinkList L, ElemType e)
{
	LinkList p;
	p = L->Next;   //p指向首元结点.

	while (p && p->data != e)//顺链域向后扫描,直到p为空或p所值结点的数据域等于e.
	{
		p = p->Next;//p指向下一结点.
	}
	return p;//查找成功,返回值为e的结点地址p,查找失败p为空.
}

5.插入:

算法步骤:                                                                                                                                       

1.查找第i-1个结点并由指针p指向该结点.  2.生成一个新结点s. 3.将新结点的数据域赋值为e.  4.将新结点s的指针域指向第i个结点. 5.将结点p的指针域 指向新结点s.

算法描述:

//插入
Status ListInsert(LinkList L, int i, ElemType e)
{
	LinkList p,s;
	int j=0;
	p = L;

	while (p && j < i - 1)  
	{
		p = p->Next;   //查找第i-1个结点,p指向该结点.
		++j;
	}
	if (!p || j > i - 1) //i值不合法.
	{
		return ERROR;
	}

	s = (LinkList)malloc(sizeof(Node));//生成新结点s.
    s->data=e;
	s->Next = p->Next;  //将新结点的指针域指向第i个结点.
	p->Next = s;  //将结点p的指针域指向结点s.
	return OK;
}

6.删除:

算法步骤:                                                                                                                                       

1.查找第i-1个结点并由指针p指向该结点. 2.临时保存待删除的结点的地址在q中,以备释放. 3.将结点p的指针域指向第i个结点的直接后继结点.  4.释放第i个结点的空间.

算法描述:

//删除
Status ListDelete(LinkList L, int i)
{
	LinkList p,q;
	int j = 0;

	while (p->Next && j < i - 1)
	{
		p = p->Next;        查找第i-1个结点,p指向该结点.
		++j;
	}
	if (!(p->Next) || j > i - 1) {//i值不合法.
		return ERROR;
	} 
	q = p->Next;        //临时保存要被删除的结点.
	p->Next = q->Next;  //改变要被删除结点前驱结点的指针域.
	free(q);  //delete q;  //释放结点q.
	return OK;
}

7.前(头)插法创建单链表:

算法步骤:                                                                                                                                       

 1.创建一个只有头结点的空链表. 2.根据待创建链表包括的元素个数n,循环n次执行以下操作: a.生成一个新结点p;  b.输入元素值赋给新结点p的数据域; c.将新结点p插入到头结点之后.

算法描述:

//头插法创建单链表(整表).
void CreateListHead(LinkList* L, int n)
{
	LinkList p;
	int i;

	*L = (LinkList)malloc(sizeof(Node));//初始化空链表L.
	(*L)->Next = NULL;

	for (i = 0; i < n; i++)
	{
		p = (LinkList)malloc(sizeof(Node));   //生成新结点p.
		cin >> p->data;
		p->Next = (*L)->Next;    //将新结点查入到头结点之后.
		(*L)->Next = p;
	}
}

8.尾插法创建单链表:

算法步骤:                                                                                                                                       

 1.创建一个只有头结点的空链表. 2.尾指针r初始化,指向头结点. 3.根据创建链表包括的元素个数n,循环n次执行以下操作:  a.生成新结点p;   b.输入元素值赋给新结点的数据域;  c.将新结点p插入到尾结点r之后;尾指针r指向新的尾结点p.

算法描述:

//尾插法创建单链表(整表).
void CreateListTail(LinkList* L, int n)
{
	LinkList p, r;
	int i;

	*L = (LinkList)malloc(sizeof(Node));//初始化空链表L.
	r = *L;

	for (i = 0; i < n; i++)
	{
		p = (LinkList)malloc(sizeof(Node));//生成新结点p.
		cin >> p->data;
		p->Next = NULL;  //将新结点p插入到尾结点r之后.
		r->Next = p;
		r = p;  //r指向新的为节点p.
	}
	r->Next = NULL;
}

9.单链表的整表删除:

算法步骤:                                                                                                                                       

1.声明结点p和q;2.将第一个结点赋值给p,下一结点赋值给q;3.循环执行释放p和q赋值给p的操作.

算法描述:

Status ClearList(LinkList* L)
{
	LinkList p, q;
	p = (*L)->Next;

	while (p)
	{
		q = p->Next;
		free(p);
		p = q;
	}
	(*L)->Next = NULL;
	return OK;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值