动态链表的创建以及对链表的基本操作

        链表(Linked table)是数据结构中最基础的概念,它是一种抽象的数据结构,由若干个节点(Node)组成,每个节点有两个部分,数据域和指针域,数据域用来存放相应的数据,指针域存放下一个节点的地址,用于之后的增删查改,最后一个节点的指针域指向NULL。在C/C++语言中,链表一般是由结构体来进行定义 ,那么就让我们先来简单的定义一个链表的节点吧。(数据域暂且定义成一个整型的变量)

#include<iostream>
#include<cstdlib>
using namespace std;

typedef int Elemtype;
typedef struct Node {
	Elemtype data;
	struct node* next;
}Node;
typedef Node* Link;

这样一个链表的节点就定义好了,接下来就是需要对链表进行的各种操作。创建链表,访问链表,找到第k位元素的位置,增加节点,删除节点,计算链表长度。接下来就让我们对每个操作进行代码的实现。

Link init(int);						//创建链表
void visit(Link);					//访问链表的元素
Link Insert(Elemtype, int, Link);	//添加新的节点
Link Delete(int, Link);				//删除节点
int Length(Link);					//求链表的长度
Link FindKth(int, Link);			//找到第k个节点的位置

动态创建链表

在动态创建链表的时候,需要有两个指针来指向链表,来便于我们的创建操作。一个是头指针h,用来指向链表的第一个节点,一个是尾指针tail,用来指向链表的表尾。

Link init(int n)
{
	Link h = NULL, tail = h, p;
	int i;
	for(i = 1; i <= n; i++)
	{
		p = new LNode;        //为节点分配空间
		cout << "please input the data:";
		cin >> p->data;
		p->next = NULL;
		if (h == NULL)        //判断头指针是否指向了头节点
			h = p;
		else
			tail->next = p;   //若头指针已经指向了头节点,则让尾指针所指向的节点的指针域指向新创建的节点 
		tail = p;             //让尾指针指向新创建的节点
	}
	return h;                 //最后返回头指针
}

访问链表

链表创建完了后,就可以对它进行访问,对整个链表进行遍历,读取它的数据。

void visit(Link h)
{
	Link p = h;
	while (p)    //当p所指向的节点指针域不为NULL,则一直循环,遍历整个链表
	{
		cout << p->data << " ";
		p = p->next;
	}
}

找到第k位元素的位置

Link FindKth(int k, Link h)
{
	Link p = h;
	int count = 1;
	while (p != NULL && count < k)
	{
		p = p->next;
		count++;
	}
	if (count == k) return p;
	else return NULL;
}

增加节点

Link Insert(Elemtype X, int i, Link h)
{
	Link p, s;
	if (i == 1)                //当插入的位序为1时,及在表头插入
	{
		s = new LNode;
		s->data = X;
		s->next = h;
		return s;
	}
	p = FindKth(i - 1, h);
	if (p == NULL)             //当所插入的位序小于0或者超出链表的范围
	{
		cout << "error!";
		return NULL;
	}
	else
	{
		s = new LNode;
		s->data = X;
		s->next = p->next;
		p->next = s;
		return h;
	}
}

删除节点

Link Delete(int i , Link h)
{
	Link t;
	if (i == 1)				//当删除的节点为头节点时
	{
		t = h;
		h = t->next;
		delete t;
		return h;
	}
	Link p;
	p = FindKth(i - 1, h);	//找到要删除的节点的前一个节点
	t = p->next;
	p->next = t->next;
	delete t;
	return h;
}

计算链表长度

int Length(Link h)
{
	Link p = h;
	int count = 0;
	while (p)
	{
		count++;
		p = p->next;
	}
	return count;
}

以上便是对链表的创建以及对它基本操作代码的实现

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值