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

目录

 单链表的基本操作

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;
}

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