c++ 单链表

目录

单链表及其结点

单链表的建立

 带头结点与不带头结点的单链表创建方式

单链表的遍历

单链表的插入

单链表结点的删除

单链表结点的修改

单链表的销毁

单链表冒泡排序


单链表及其结点

链表是一种数据结构。它是通过动态分配内存、结构体与指针的配合来实现的。

链表是一系列的存储数据元素的单元通过指针串接起来形成的,因此每个单元至少有两个域,数据域用于数据元素的存储,指针域是指向其他单元的指针。具有一个数据域和多个指针域的存储单元通常称为结点。

此外,链表要有一个指向链表的起始结点的头指针变量head。

在结点中数据域用来存储数据元素,指针域用于指向下一个具有相同结构的结点。因为只有一个指针结点,称为单链表,如图所示:

 单链表“结点”结构的一般声明形式:

//单链表“结点”结构声明
typedef struct LinkNode
{
	int data;
	struct LinkNode* next;
}LinkNode,*LinkList;

单链表的建立

建立单链表,需要一个个地开辟结点和输入各结点数据,并建立起结点之间的联系。建立单链表的步骤:

(1)如果是空链表,即没有信息,要把新建的结点作为链表的第一个结点,也就是让头指针head指向新结点,并让新结点指向空;

(2)如果不是空链表,则将新建结点添加在表尾。

 带头结点与不带头结点的单链表创建方式

设置头结点的作用:

通过设置头结点,从而保证处理第一个结点与后面结点的方法一致,首元素也有了前驱结点,更容易对首元素进行操作。需要注意的是头结点中不存放数据。

                            

创建带有头结点的单链表时,要对头结点进行初始化:

//对头结点初始化
head = new student;
head->num = 0;
head->name[0] = '\0';
head->score = 0;
head->next = NULL;
tail = head;//空表时,表头即表尾

单链表的遍历

遍历即利用指针依次将各个结点的数据输出

(1)声明指针p,并指向第一个结点;
(2)当p不为空,重复如下两个操作:输出p所指结点中的元素;指针p后移指向下一个元素。

void Print(LinkList head)
{
    LinkList p = head->next;

    while (p)
    {
        printf("%d ", p->date);
        p = p->next;
    }
}

单链表的插入

先创建一个结点,将其指针域赋为空,然后分情况进行插入:

(1)如果是空链表,让要插入的结点作为第一个结点;

(2)如果不是空链表,让待插入的结点的指针域指向插入点的下一个结点(p->next=pre->next),然后(pre->next=p);

(3)若在表尾插入,让末结点指针指向插入结点。

void link::insert()
{
    stuptr p, pre, pnode;
    int sno;
    cout << "请输入要在哪个学号之后插入学生信息:" << endl;
    cin >> sno;
    pnode = new student;
    cout << "请输入插入学生的信息:" << endl;
    cin >> pnode->num;
    p = head->next;
    pre = head;
    while (p != NULL)
    {
        pre = p;
        if (p->num == sno)
        {
            break;
        }
        p = p->next;
    }
    pnode->next = pre->next;
    pre->next = pnode;
}

单链表结点的删除

要删除结点p,要先找到前驱结点pre,然后将前驱结点的指针域指向待删除结点的后续结点,然后释放要删除的结点的存储空间。

 

void list::Delete()
{
    int sno;
    stuptr p, pre;
    cout << "请输入要删除的学号" << endl;
    cin >> sno;
    pre = head;
    p = head->next;
    while (p != NULL)
    {
        if (p->num == sno)
        {
            pre->next = p->next;
            delete[] p;
            p = NULL;
            cout << "创建成功" << endl;
            return;
        }
        pre = p;
        p = p->next;
    }
    cout << "未找到该结点" << endl;
}

单链表结点的修改

修改过程:先通过遍历找到要修改的结点,然后将新值写到该结点数据域中。

void correct()
{
    list * abs = Head;
    int number;
    cout << "输入查找内容:"<<endl;
    cin >> number;
    while (abs != NULL)
    {
        if (abs->number == number)
        {
            cout << abs->number;
            cin >> number;
            abs->number = number;
            cout << "修改成功" << endl;
        }
        abs = abs->next;
    }

单链表的销毁

当不再使用某个单链表的时候,要把链表进行销毁以减少资源浪费。利用指针变量从头到尾依次指向各个结点,每指向一个结点,就把该结点存储空间释放掉,直到末结点。

void list::destroy()
{
	stuptr pl, ptr;
	p = head;
	while (p != NULL)
	{
		ptr = p;
		p = p->next;
		delete[]ptr;
	}
	head = NULL;
	cout << "链表已经销毁" << endl;
}

单链表冒泡排序

void list::sort()
{
	stuptr pre, p, q;
	stuptr end = NULL;
	while (head->next != end)
	{
		pre = head;
		p = head->next;
		q = p->next;
		while (p->next != NULL)
		{
			if (p->score > q->score)
			{
				pre->next = q;
				p->next = q->next;
				q->next = p;
			}
			else
			{
				p = p->next;
			}
			q = p->next;
			pre = pre->next;
		}
			end = p;
	}
}

以上就是c++单链表的相关知识啦,如有不足 敬请指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值