2021.5.29 链表

Posted young_forever

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021.5.29 链表相关的知识,希望对你有一定的参考价值。

一.为什么要用链表而不是数组

  数组在定义了大小以后就不能随便改变了,而且数组要在内存中申请一块连续的区域,而链表可以随时增加或者减小元素,它的存储空间也是动态的。这对于内存的使用更加有性价比。

二.链表的组成部分

  链表由头指针(不包括数据区域,只包含指向头节点的指针构成),头节点,常规节点,尾指针组成,尾节点(只有数据区域,指针区域是NULL)构成。

三.如何构建一个常规节点?

************************

struct Stu

{                               //创建一个节点,它包括id(数据部分),和一个地址部分
  int id;
  char name[50];
  struct Stu* next;        // 这里代表创建一个指针,这个指针指向的数据类型是Stu这种结构体

};

************************

四.如何创建新的链表?

************************

struct Stu* create(int n)

{ //创建一个create函数,参量是要输入信息的个数
  struct Stu* head, * node, * end; //定义头节点,普通节点,尾节点   ps:这里定义成*head,*node的原因是这些代表的都是地址。
  head = (struct Stu*)malloc(sizeof(struct Stu)); //给头节点申请内存
  end = head; //若是空表,则头尾地址一致
  for (int i = 0; i < n; i++) { //利用for循环向链表中添加数据
  node = (struct Stu*)malloc(sizeof(struct Stu));//给普通节点申请内存空间

  scanf("%d%s", &node->id, &node->name); //给数据域赋值    ps:这里VS2019可能会报错C6031返回值被忽略,以及C6011取消对NULL指针“node”的引用  解决方法:?
  end->next = node; //让上一个节点的地址域指向当前节点 ,这里把end写成head更好理解。

  printf("%p",node);  //加这句话是打印出新增node节点的地址,实际上上一句话的意思就是说把新节点的地址赋值给上一个节点的地址区域。
  end = node; //end指向当前节点,最终end指向尾节点 ,这个时候这个新写入的节点就变成最后一个节点了。
}
end->next = NULL; //给end的指针域置空
return head; //返回头节点的地址
}

*************************

五.打印出这整个链表

*************************

void print(struct Stu* head)

{
  struct Stu* p = head;
  int j = 1;
  p = p->next; //不打印头节点的数据域中的值
  while (p != NULL)

   {

    printf("%d\\t%d\\t%s\\n", j, p->id, p->name);
    p = p->next;
    j++;
  }
}

***************************

六.如何在特定位置插入一个节点?

七.如何删除某个特定位置的节点?

 

以上是关于2021.5.29 链表的主要内容,如果未能解决你的问题,请参考以下文章

数据结构-链表链表的相关算法

[11道链表经典笔试题]优化的算法思想:反转链表链表相交快慢指针

reorder-list——链表快慢指针逆转链表链表合并

何为链表链表示例以及翻转链表

关于相交链表带环链表链表深拷贝的思路整理

数据结构:链表链队列