单链表的插入、删除、按位查找、按值查找以及求单链表长度

目录

 单链表的基本操作

1.定义单链表结点类型

2.头插法建立单链表

3.尾插法建立单链表

4.按序号查找结点

5.按值查找元素

6.在第i的位置上插入e

7.删除第i位置上的节点

8.求单链表的长度

9.打印单链表的值

10.主函数

 单链表的基本操作

以下内容中都是int型为例

1.定义单链表结点类型

typedef struct Lnode {
	int data;	//数据域
	struct Lnode* next;		//指针域
}LNode, *Linklist;


2.头插法建立单链表

先建立头结点,将元素依次插入到头结点的后面

Linklist List_HeadInsert(Linklist& L) {
	//创建头结点
	L = new LNode();
	L->next = nullptr;

	LNode* s;
	for (int i = 0; i < 5; i++)
	{
		//头插法
		s = new LNode();
		s->data = i;
		s->next = L->next;
		L->next = s;
	}
	return L;
}

3.尾插法建立单链表

先建立头结点,再建立一个结点 r 记录单链表最后一个结点,初始时指向头结点;在结尾每插入一个结点 更新 一次 r 为最后一个结点。

Linklist List_TailInsert(Linklist& L) {
	//创建头结点
	L = new LNode();
	L->next = nullptr;

	LNode* s;
	//r为表尾指针
	LNode* r = L;
	for (int i = 0; i < 5; i++)
	{
		//尾插法
		s = new LNode();
		s->data = i;
		r->next = s;
		r = s;
	}
	r->next = nullptr; //尾节点指针置空
	return L;
}

4.按序号查找结点

在单链表的第一个结点开始,按指针next逐个查找,直到第i个位置。(需要判断i的位置)。

LNode* GetElem(Linklist L, int i)
{
	int j = 1;
	LNode* p = L->next;
	if (i == 0)
	{
		return L;	//i等于0返回头结点
	}
	if (i < 0 )
	{
		return nullptr;		//i无效
	}
	while (p !=nullptr && j < i)
	{
		p = p->next;
		j++;
	}
	return p;
}

5.按值查找元素

在单链表的第一个结点开始,按指针next逐查找,找到第一个值相同的返回结点。没有相同的结点返回空。

LNode* LocateElem(Linklist L, int e)
{
	LNode* p = L->next;
	while (p != nullptr && p->data != e)
	{
		p = p->next;
	}
	return p;	//找到返回节点指针,否则返回空
}

6.在第i的位置上插入e

先判断第i个位置的合法性,然后找到第i个位置的前驱,即第i-1个结点,再在后面插入新结点。

bool InsertElem(Linklist& L,int i, int e)
{
	//判断i的位置是否合法
	if (i <= 0 )
	{
		return false;
	}
	//找到第i个位置的前驱
	LNode* p = GetElem(L, i - 1);
	//如果前驱为空,i不合法
	if (p == nullptr)
	{
		return false;
	}
	//创建一个节点
	LNode* s = new LNode();
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}

7.删除第i位置上的节点

先判断第i个位置的合法性,然后找到第i个位置的前驱,即第i-1个结点,删除第i个结点。

bool deleteElem(Linklist& L, int i, int& e)
{
	//判断i的位置是否合法
	if (i <= 0)
	{
		return false;
	}
	//找到第i个位置的前驱
	LNode* p = GetElem(L, i - 1);
	//如果前驱为空,i不合法
	if (p == nullptr)
	{
		return false;
	}
	//如果第i的位置为空,无需删除,返回false
	if (p->next == nullptr)
	{
		return false;
	}

	LNode* q = p->next;
	e = q->data;
	p->next = q->next;
	delete q;
	q = nullptr;
	return true;
}

8.求单链表的长度

设置一个计数器变量,从第一个结点开始顺序访问,每访问一个结点,计数器加1,直到访问到最后一个结点为止。

void printNode(Linklist L)
{
	LNode* p = L->next;
	while (p != nullptr)
	{
		cout << p->data << "  ";
		p = p->next;
	}
	cout << endl;
}

9.打印单链表的值

void printNode(Linklist L)
{
	LNode* p = L->next;
	while (p != nullptr)
	{
		cout << p->data << "  ";
		p = p->next;
	}
	cout << endl;
}

10.主函数

根据以上操作进行的简单测试。

int main()
{
    //创建单链表
    //头插法
    Linklist L1;
    Linklist List1 = List_HeadInsert(L1);
    cout << "L1: ";
    printNode(List1);

    //尾插法
    Linklist L2;
    Linklist List2 = List_TailInsert(L2);
    cout << "L2: ";
    printNode(List2);

    //查找单链表L2的第三个元素
    LNode *p = GetElem(L2, 3);
    cout << "L2的第三个元素值为:" << p->data << endl;

    //找到单链表L2值为3的结点
    p = LocateElem(L2, 3);
    cout << "p的值为:" << p->data << endl;

    //在单链表L2的第2 个位置插入8
    if (InsertElem(L2, 2, 8))
    {

        cout << "插入成功!L2: ";
        printNode(List2);
    }
    else {
        cout << "插入失败!" << endl;
    }

    //求单链表L2的长度
    int tmp = LinkLIstLength(L2);
    cout << "L2的长度为:" << tmp << endl;

    //删除单链表L2的第四个元素
    int e;
    if (deleteElem(L2, 4, e))
    {

        cout << "删除成功!L2: ";
        printNode(List2);
        cout << "删除元素的值为:" << e << endl;
    }
    else {
        cout << "删除失败!" << endl;
    }

    //求单链表L2的长度
    tmp = LinkLIstLength(L2);
    cout << "L2的长度为:" << tmp << endl;
}

  • 1
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这是一个关于单链表的问题,我会帮你解答。 以下是单链表的基本结构体定义: ``` typedef struct Node { int data; // 存储的数据 struct Node *next; // 指向下一个节点的指针 } Node, *LinkedList; // 定义节点类型和链表类型 ``` 其中,`Node` 表示链表的节点,`next` 指向下一个节点的指针。`LinkedList` 表示整个链表。 接下来是单链表的基本操作: 1. 链表长度 ``` int getLength(LinkedList L) { int len = 0; // 链表长度 Node *p = L; // 定义指针p指向链表头节点 while(p != NULL) { // 遍历链表 len++; // 长度加1 p = p->next; // 指针指向下一个节点 } return len; } ``` 2. 查找指定节点 ``` Node *findNode(LinkedList L, int x) { Node *p = L; // 定义指针p指向链表头节点 while(p != NULL) { // 遍历链表 if(p->data == x) { // 找到指定节点 return p; } p = p->next; // 指针指向下一个节点 } return NULL; // 没有找到,返回NULL } ``` 3. 插入节点 ``` void insertNode(LinkedList L, int x, int pos) { Node *p = L; // 定义指针p指向链表头节点 Node *newNode = (Node *)malloc(sizeof(Node)); // 创建新节点 newNode->data = x; // 设置新节点数据 newNode->next = NULL; // 新节点的下一个节点指向NULL for(int i = 1; i < pos; i++) { // 找到插入位置的前一个节点 p = p->next; } newNode->next = p->next; // 新节点的下一个节点指向插入位置的节点 p->next = newNode; // 插入位置的前一个节点的下一个节点指向新节点 } ``` 4. 删除节点 ``` void deleteNode(LinkedList L, int x) { Node *p = L; // 定义指针p指向链表头节点 Node *q = NULL; // 定义指针q指向要删除的节点的前一个节点 while(p != NULL && p->data != x) { // 找到要删除的节点 q = p; p = p->next; } if(p == NULL) { // 没有找到要删除的节点 printf("没有找到要删除的节点\n"); return; } q->next = p->next; // 要删除的节点的前一个节点的下一个节点指向要删除的节点的下一个节点 free(p); // 释放要删除的节点的内存 } ``` 以上就是单链表的基本操作。希望能够对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值