链表基础知识(创建、删除、插入)

链表是一种常见的重要的数据结构。它是动态进行存储分配的一种结构。链表中各元素在内存中的地址可以是不连续的。要找到某一元素,必须先找到上一个元素,根据它提供的下一个元素的地址才能找到下一个元素。如果不提供”头指针“则整个链表都无法访问。链表如同一条铁链一样,中间不能断开。链表这种数据结构,必须利用指针变量才能实现,即一个结点中应包含一个指针变量,用它存放下一结点的地址。
静态链表是很简单的,所有结点都是在程序中定义好的,不是临时开辟的,也不能用完后释放,这种链表成为”静态链表“。
动态链表:指在程序执行过程中从无到有地建立起一个链表,即一个一个地开辟结点和输入各结点数据,并建立起”铁链“关系。
上图中就是利用指针建立了一个静态链表,结点在程序都已经一个一个定义好。在这里插入图片描述

那么要如何创建动态链表呢?
1.先建立一个结构体,结构体中定义一个指针让它能指向下一个地址。
struct link {
int a;
struct link *next;
};//strcut link *next 就是。
2.建立头结点和尾节点和中间结点。
struct link *head = NULL;//创捷结点时要给它一个初始值NULL,否则它会变成一个野指针,带来许多危害。
struct link *tail = NULL;
struct link *node = NULL;
创建动态链表就是先创建出一个头结点,然后其指向下一个结点node,让tail尾节点等于node结点,再使tail的下一结点指向一个更新的新结点node2,然后让tail等于node2,此时tail指向node3。这样不断循环,只要有需求就能不断地创造出结点。这便是不断开辟空间的动态链表。
head = (struct link *)malloc(sizeof(struct link));//给头结点分配空间
head->a = 5;//初始化结构体
head->next = NULL; //给指针变量分配空间
tail = head;//首先令尾节点等于头结点
for (i = 0; i < 3; i++) { //这里设置可以创造出三个结点
node = (struct link *)malloc(sizeof(struct link));//需要给新结点空间
node->a = i;//初始化新结点
node->next = NULL;//给新结点的指针变量分配空间
tail->next = node;//始终令尾节点指向下一节点
tail = node;//令尾节点等于最新的结点
}
链表的插入。
假设现在有head,node1,node2三个结点。我们想在node1和node2之间插入一个结点。那我们我们只需要建立一个结点node,先令这个结点的指针变量指向node2,然后让node1的指针变量指向node。断开node1指向node2的指针即可。
struct link *addLink(struct link *head){
struct link *node; //建立要插入的结点node
node=(struct link *)malloc(sizeof(struct link)); //分配空间
node->a=10; //初始化
node->next=NULL; //初始化node的指针变量分配空间
node->next=node1->next;//令node指向node2
node->next=node;//令node1指向node

   return head;

}

链表的删除
假设现在有head,node1,node2结点,我们需要删除node2结点。那么我们可以先令node1结点指向node2结点所指向的地址,然后释放掉node2结点所占的空间。那么node1结点就接替了node2结点。
struct link *delLink(struct link *head, int n) {
struct link *del; //另设立一个结点地址
struct link *prev;

    prev = head;
   while (prev->next != NULL && prev != NULL)  //判断需要删除的结点是否为空结点,是的话则不能删除
      if (prev->next->a == n) {   //先找出需要删除的结点的上一个结点
          break;
    }
  del = prev->next;    //令另设立的结点地址等同于准备被删除的结点的地址
  prev->next = del->next;  //令上一个结点指向的地址等同于准备被删除的结点指向的地址
  free(del);  //释放结点的空间,删除这个结点

  return head;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值