秒懂链表“增删查改”的操作(配图,超易理解)

链表是一种物理存储单元上非连续、非顺序的存储结构数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。

使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理

链表结构的存储结构如下(带头结点的情况)

 头结点:一般不存储数据。

其他结点:包括数据域和指针域。

数据域:存储数据元素。

指针域:存储存储下一个结点的地址。

链表的常见操作(初始化与增删查改)

ps:接下来都以“工人”结构体作为分析对象

typedef struct Worker
{
    //数据域
    char *name;  //姓名
    int id;  //工号
    unsigned int age;  //年龄
    float salary;  //工资

    //指针域
    struct Worker *next;  //用于指向下一个结点的指针

} Worker, *PWorker; 

1.链表的初始化(生成头结点)

PWorker init()
{
    PWorker head;  //声明结点指针
    head = (Worker *)malloc(sizeof(Worker));  //生成头结点并把地址赋值给head
    if (!head)
        return NULL;
    head->next = NULL;
    return head;
}

2.增加结点(头插法)

void insert_worker(PWorker wrk, char *name, int id, unsigned int age,  float salary)
{
    PWorker p;
    p = (Worker *)malloc(sizeof(Worker));  //生成结点
    p->name = name, p->id = id, p->age = age,  p->salary = salary;  //数据域赋值
    p->next = wrk->next;  //新结点指针域指向头结点的下一个结点
    wrk->next = p;  //头结点指针域指向新结点
}

ps:  wrk与p在这里是对应结点的指针变量,不是结点的变量名,为了画出来的图方便理解,我就直接叫wrk结点与p结点,敬请理解。

3.删除结点(这里以根据id删除结点为例)

void delete_worker(PWorker wrk ,int id)
{
	PWorker ptr1,ptr2;  //ptr2用于寻找id所在的目标结点,ptr1指向ptr2的前驱结点
	ptr1 = wrk;
	ptr2 = wrk->next;
	while(ptr2)
	{
		if(ptr2->id == id)
		{
            //找到目标结点,退出循环
			break;
		}
		ptr1 = ptr1->next;
		ptr2 = ptr2->next;
	}
	if(ptr2)
	{
		ptr1->next = ptr2->next;  //前驱结点指针域指向目标结点的下一个结点
		free(ptr2);  //释放目标结点
		ptr2 = NULL;
	}
	else
	{
		printf("工号%d不存在!\n",id);
	}
}

4.查询链表中的数据

void print_worker(const PWorker wrk)
{
    PWorker prt = wrk->next;  //从头结点的下个结点开始查询
    printf("========= 工人基本信息 ===============\n");
    printf("姓名\t工号\t年龄\t工资\n");
    printf("--------------------------------------\n");
    for (; prt; prt = prt->next)
    {
        printf("%s\t%d\t%d\t%.2f\n",
               prt->name, prt->id, prt->age, prt->salary);
    }
    printf("======================================\n");
}

5.修改某个结点的数据(这里以根据id修改工资为例)

void revise_worker(PWorker wrk,int id,float salary)
{
	PWorker ptr = wrk->next;
	while(ptr)
	{
		if(ptr->id==id)
		{
			ptr->salary = salary;
			return;
		}
		ptr = ptr->next;
	}
	printf("工号%d不存在!\n",id);
}

以上就是链表的“初始化”和“增删查改”的基本用法,希望可以给您带来帮助。 

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旧颜℃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值