当前位置: 首页 > news >正文

目前哪些企业需要做网站建设的呢网站宣传和推广的方法有哪些

目前哪些企业需要做网站建设的呢,网站宣传和推广的方法有哪些,网站建设dqcx,dw旅游网站怎么做目录 前言一、链表的定义二、链表的分类1. 单向和双向2. 带头和不带头3. 循环和不循环4. 常用(无头单向非循环链表和带头双向循环链表) 三、无头单向非循环链表的接口及实现1. 单链表的接口2. 接口的实现 四、带头双向循环链表接口的及实现1. 双向链表的…

目录

  • 前言
  • 一、链表的定义
  • 二、链表的分类
    • 1. 单向和双向
    • 2. 带头和不带头
    • 3. 循环和不循环
    • 4. 常用(无头单向非循环链表和带头双向循环链表)
  • 三、无头单向非循环链表的接口及实现
    • 1. 单链表的接口
    • 2. 接口的实现
  • 四、带头双向循环链表接口的及实现
    • 1. 双向链表的接口
  • 2. 接口的实现
  • 五、带头双向循环链表VS无头单向非循环链表
    • 1. 带头双向循环链表
      • 1.1 带头双向循环链表的优点:
      • 1.2 带头双向循环链表的缺点:
    • 2. 无头单向非循环链表
      • 2.1 无头单向非循环链表的优点:
      • 2.2 无头单向非循环链表的缺点:
    • 3. 小结
  • 六、链表VS顺序表
    • 1. 带头双向循环链表
      • 1.1 链表的优点:
      • 2. 链表的缺点:
    • 2. 顺序表
      • 2.1顺序表的优点
      • 2.2顺序表的缺点
  • 结尾

前言

上一篇文章讲述了线性表中的顺序表,这篇文章讲述关于链表的定义、类别、实现、多种不同链表的优缺点和链表与顺序表的优缺点。
关于上一篇文章的链接:线性表之顺序表

一、链表的定义

链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

在这里插入图片描述

二、链表的分类

1. 单向和双向

在这里插入图片描述

在这里插入图片描述

2. 带头和不带头

在这里插入图片描述
在这里插入图片描述

3. 循环和不循环

在这里插入图片描述
在这里插入图片描述

4. 常用(无头单向非循环链表和带头双向循环链表)

在这里插入图片描述

在这里插入图片描述

三、无头单向非循环链表的接口及实现

1. 单链表的接口

#pragma once
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>// slist.h
typedef int SLTDateType;
typedef struct SListNode
{SLTDateType data;struct SListNode* next;
}SListNode;// 动态申请一个节点
SListNode* BuySListNode(SLTDateType x);
// 单链表打印
void SListPrint(SListNode* plist);
// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDateType x);
// 单链表的头插
void SListPushFront(SListNode** pplist, SLTDateType x);
// 单链表的尾删
void SListPopBack(SListNode** pplist);
// 单链表头删
void SListPopFront(SListNode** pplist);
// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x);
// 单链表在pos位置之后插入x
void SListInsertAfter(SListNode* pos, SLTDateType x);
// 单链表删除pos位置之后的值
void SListEraseAfter(SListNode* pos);
// 单链表的销毁
void SListDestroy(SListNode* plist);

2. 接口的实现

#include "slist.h"SListNode* BuySListNode(SLTDateType x)
{//创造新节点SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));if (newnode == NULL){perror("malloc");return NULL;}//新节点初始化newnode->data = x;newnode->next = NULL;return newnode;
}void SListPushBack(SListNode** pplist, SLTDateType x)
{//这里使用二级指针的原因是://若链表为空,需要改变的就是结构体指针,需要结构体指针的地址//若传入的是一级指针,这里传入的只是临时拷贝,无法改变函数外的变量if (*pplist == NULL){*pplist = BuySListNode(x);}//若不为空,需要改变的是结构体,只需要结构体的指针else{SListNode* tail = *pplist;SListNode* newnode = BuySListNode(x);while (tail->next){tail = tail->next;}tail->next = newnode;}}void SListPrint(SListNode* plist)
{while (plist){printf("%d->", plist->data);plist = plist->next;}printf("NULL");
}void SListPushFront(SListNode** pplist, SLTDateType x)
{//这里使用二级指针的原因是:每次头删都需要改变头节点SListNode* newnode = BuySListNode(x);newnode->next = *pplist;*pplist = newnode;
}//无头单链表尾删删除节点的时候有三种情况
void SListPopBack(SListNode** pplist)
{//没有节点assert(*pplist);//一个节点if ((*pplist)->next == NULL){free(*pplist);*pplist = NULL;}//多个节点else{//尾删既可以找尾找尾的前一个节点,也可以创造一个变量记录尾节点的前一个节点//创造一个变量记录尾节点的前一个节点//	SListNode* tail = *pplist;//	SListNode* prev = NULL;//	while (tail->next)//	{//		prev = tail;//		tail = tail->next;//	}//	free(prev->next);//	prev->next = NULL;//找尾找尾的前一个节点SListNode* tail = *pplist;while (tail->next->next){tail = tail->next;}free(tail->next);tail->next = NULL;}
}//无头单链表头删删除节点的时候有三种情况,但只有一个节点和多个节点的情况可以合并
void SListPopFront(SListNode** pplist)
{//无节点时assert(*pplist);//有节点时SListNode* del = *pplist;*pplist = del->next;free(del);
}SListNode* SListFind(SListNode* plist, SLTDateType x)
{SListNode* cur = plist;while (cur){if (cur->data == x)return cur;cur = cur->next;}return NULL;
}void SListInsertAfter(SListNode* pos, SLTDateType x)
{//断言:在pos后面插入一个节点,最差的情况是pos为尾节点,但不能为NULLassert(pos);SListNode* cur = (SListNode*)malloc(sizeof(SListNode));if (cur == NULL){perror("malloc");return;}cur->data = x;cur->next = pos->next;pos->next = cur;
}void SListEraseAfter(SListNode* pos)
{//需要删除节点的前一个节点不能为NULL,删除节点也不能为NULLassert(pos);assert(pos->next);SListNode* next = pos->next;pos->next = next->next;free(next);
}void SListDestroy(SListNode* plist)
{SListNode* del = NULL;while (plist){del = plist;plist = plist->next;free(del);}
}

四、带头双向循环链表接口的及实现

1. 双向链表的接口

#pragma once#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>// 带头+双向+循环链表增删查改实现
typedef int LTDataType;
typedef struct ListNode
{LTDataType data;struct ListNode* next;struct ListNode* prev;
}ListNode;// 创建返回链表的头结点.
ListNode* ListCreate();
// 双向链表销毁
void ListDestory(ListNode* pHead);
// 双向链表打印
void ListPrint(ListNode* pHead);
// 双向链表尾插
void ListPushBack(ListNode* pHead, LTDataType x);
// 双向链表尾删
void ListPopBack(ListNode* pHead);
// 双向链表头插
void ListPushFront(ListNode* pHead, LTDataType x);
// 双向链表头删
void ListPopFront(ListNode* pHead);
// 双向链表查找
ListNode* ListFind(ListNode* pHead, LTDataType x);
// 双向链表在pos的前面进行插入
void ListInsert(ListNode* pos, LTDataType x);
// 双向链表删除pos位置的节点
void ListErase(ListNode* pos);

2. 接口的实现

#include "list.h"// 创建返回链表的头结点.
ListNode* ListCreate()
{ListNode* phead = (ListNode*)malloc(sizeof(ListNode));if (phead == NULL){perror("malloc");return NULL;}//让头的 next 和 prev 都指向自己//则双向链表为空phead->next = phead;phead->prev = phead;return phead;
}// 创造新节点
ListNode* BuyTLNode(LTDataType x)
{ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));if (newnode == NULL){perror("malloc");return NULL;}newnode->data = x;return newnode;
}// 双向链表尾插
void ListPushBack(ListNode* pHead, LTDataType x)
{/*ListNode* tail = pHead->prev;ListNode* newnode = BuyTLNode(x);newnode->next = pHead;newnode->prev = tail;tail->next = newnode;pHead->prev = newnode;*/ListInsert(pHead, x);   //复用
}// 双向链表打印
void ListPrint(ListNode* pHead)
{printf("header <--> ");//打印的时候,由于头内的 data 的值没用//则从头的的下一个节点开始打印//并且在循环到头的时候打印结束ListNode* cur = pHead ->next;while (cur != pHead){printf("%d <--> ", cur->data);cur = cur->next;}printf("\n");
}// 判断双向链表是否为空
bool LTEmpty(ListNode* pHead)
{assert(pHead);return pHead->next == pHead;
}// 双向链表头删
void ListPopFront(ListNode* pHead)
{assert(pHead);assert(!(LTEmpty(pHead)));/*ListNode* first = pHead->next;ListNode* second = first->next;pHead->next = second;second->prev = pHead;free(first);*/ListErase(pHead->next);   //复用
}// 双向链表头插
void ListPushFront(ListNode* pHead, LTDataType x)
{/*ListNode* next = pHead->next;ListNode* newnode = BuyTLNode(x);newnode->next = next;newnode->prev = pHead;next->prev = newnode;pHead->next = newnode;*/ListInsert(pHead->next, x);//复用
}// 双向链表尾删
void ListPopBack(ListNode* pHead)
{assert(pHead);               assert(!(LTEmpty(pHead)));/*ListNode* tail = pHead->prev;ListNode* tailPrev = tail->prev;tailPrev->next = pHead;pHead->prev = tailPrev;free(tail);*/ListErase(pHead->prev); //复用
}// 双向链表查找
ListNode* ListFind(ListNode* pHead, LTDataType x)
{ListNode* cur = pHead ->next;while (cur){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}// 双向链表在pos的前面进行插入
void ListInsert(ListNode* pos, LTDataType x)
{assert(pos);ListNode* newnode = BuyTLNode(x);ListNode* posPrev = pos->prev;newnode->next = pos;newnode->prev = posPrev;posPrev->next = newnode;pos->prev = newnode;
}
// 双向链表删除pos位置的节点
void ListErase(ListNode* pos)
{assert(pos);ListNode* posPrev = pos->prev;ListNode* posNext = pos->next;posPrev->next = posNext;posNext->prev = posPrev;free(pos);
}

五、带头双向循环链表VS无头单向非循环链表

1. 带头双向循环链表

1.1 带头双向循环链表的优点:

  1. 可以自由地在链表中任意位置插入和删除节点,这是因为双向链表可以方便地找到前驱后继节点
  2. 可以支持双向遍历,即可以从前往后或从后往前遍历链表。
  3. 可以更加高效地实现某些特殊的操作,比如在链表中删除指定节点,需要同时修改其前驱和后继节点的指针,双向链表则可以直接完成这个操作,而单向链表则需要遍历到前驱节点才能完成。

1.2 带头双向循环链表的缺点:

  1. 因为每个节点都要额外存储一个前驱节点的指针,所以需要更多的内存空间。
  2. 因为需要维护前驱和后继节点的指针,所以在插入和删除节点时需要更多的操作,导致时间复杂度较高。

2. 无头单向非循环链表

2.1 无头单向非循环链表的优点:

  1. 因为每个节点只需存储一个后继节点的指针,所以需要较少的内存空间。
  2. 在插入和删除节点时,只需要修改前一个节点的指针,不需要修改后一个节点的指针,操作相对简单,导致时间复杂度较低。

2.2 无头单向非循环链表的缺点:

  1. 无法实现双向遍历,即无法从后往前遍历链表。
  2. 在删除指定节点时,需要先遍历到其前驱节点,才能完成删除操作,导致删除效率较低。

3. 小结

总之,选择哪种链表数据结构应该根据具体的应用场景和需要做的操作来决定。如果需要频繁地插入和删除节点,且需要支持双向遍历,可以选择带头双向循环链表;如果需要占用较少的内存空间,且不需要双向遍历,可以选择无头单向非循环链表。


六、链表VS顺序表

1. 带头双向循环链表

1.1 链表的优点:

  1. 动态内存分配:链表可以在运行时动态地分配内存,因此可以根据实际需要灵活地增加或减少节点数。
  2. 插入和删除操作高效:由于链表中的元素不必在连续的内存空间中存储,所以插入和删除操作非常高效,只需要修改指针,而不需要移动所有后续元素。
  3. 大小不受限制:链表的大小不受限制,可以根据实际需要进行扩展。

2. 链表的缺点:

  1. 随机访问低效:由于链表中的元素不是按顺序存储的,因此随机访问某个元素的效率比较低,需要从头开始遍历O(N)
  2. 存储空间开销大:链表每个节点都需要额外的指针来指向下一个节点,这样会增加存储空间的开销。
  3. 缓存不友好:由于链表中的元素不是按顺序存储的,因此可能会导致缓存未命中,降低访问效率。

2. 顺序表

2.1顺序表的优点

  1. 随机访问高效:下标的随机访问效率高O(1)
  2. 尾删尾插高效:顺序表的尾插尾删不需要移动数据,效率高。
  3. 缓存友好:由于链表中的元素是按顺序存储的,缓存命中率高,访问效率高。

2.2顺序表的缺点

  1. 部分插入删除操作低效:由于顺序表中的元素是物理结构上是连续的,当数据插入删除前面顺序表的时候需要移动数据,效率低O(N)
  2. 内存大小受限:当顺序表内存存满后需要扩容,扩容需要代价,并且顺序表通常会有内存的浪费情况。

结尾

如果有什么建议和疑问,或是有什么错误,希望大家能够提一下。
希望大家以后也能和我一起进步!!
如果这篇文章对你有用的话,希望能给我一个小小的赞!


文章转载自:
http://stoep.jpkk.cn
http://parenteral.jpkk.cn
http://varuna.jpkk.cn
http://unquestionable.jpkk.cn
http://aryl.jpkk.cn
http://lampad.jpkk.cn
http://winona.jpkk.cn
http://galenism.jpkk.cn
http://pulj.jpkk.cn
http://enquiringly.jpkk.cn
http://frondeur.jpkk.cn
http://accordancy.jpkk.cn
http://citric.jpkk.cn
http://testibiopalladite.jpkk.cn
http://dendron.jpkk.cn
http://appall.jpkk.cn
http://disregardfully.jpkk.cn
http://decreasingly.jpkk.cn
http://subdural.jpkk.cn
http://oratorial.jpkk.cn
http://handicraft.jpkk.cn
http://boomlet.jpkk.cn
http://lemming.jpkk.cn
http://flannelboard.jpkk.cn
http://silastic.jpkk.cn
http://nucleogenesis.jpkk.cn
http://repeated.jpkk.cn
http://ussuriisk.jpkk.cn
http://dialysable.jpkk.cn
http://myelitis.jpkk.cn
http://cdpd.jpkk.cn
http://traintime.jpkk.cn
http://cloudy.jpkk.cn
http://supermanly.jpkk.cn
http://youngster.jpkk.cn
http://antidepressive.jpkk.cn
http://retroflexion.jpkk.cn
http://philomena.jpkk.cn
http://nectarize.jpkk.cn
http://midcourse.jpkk.cn
http://hipshot.jpkk.cn
http://transilluminate.jpkk.cn
http://cerebralism.jpkk.cn
http://unix.jpkk.cn
http://decomposer.jpkk.cn
http://noia.jpkk.cn
http://brisket.jpkk.cn
http://offline.jpkk.cn
http://zoftig.jpkk.cn
http://heintzite.jpkk.cn
http://ultramundane.jpkk.cn
http://reptilia.jpkk.cn
http://have.jpkk.cn
http://orthoscopic.jpkk.cn
http://anchises.jpkk.cn
http://mingle.jpkk.cn
http://airwaves.jpkk.cn
http://sibylline.jpkk.cn
http://feminise.jpkk.cn
http://ciq.jpkk.cn
http://tattletale.jpkk.cn
http://myxomatosis.jpkk.cn
http://trothplight.jpkk.cn
http://topee.jpkk.cn
http://tullibee.jpkk.cn
http://infelicitous.jpkk.cn
http://anthozoa.jpkk.cn
http://insectivorous.jpkk.cn
http://heptangular.jpkk.cn
http://hellas.jpkk.cn
http://archerfish.jpkk.cn
http://longhair.jpkk.cn
http://lipidic.jpkk.cn
http://disesteem.jpkk.cn
http://noiseful.jpkk.cn
http://stakhanovism.jpkk.cn
http://paperhanging.jpkk.cn
http://slashing.jpkk.cn
http://unobstructed.jpkk.cn
http://graywater.jpkk.cn
http://preinvasive.jpkk.cn
http://eosinophilia.jpkk.cn
http://ashamed.jpkk.cn
http://rockman.jpkk.cn
http://rewind.jpkk.cn
http://netted.jpkk.cn
http://pustulate.jpkk.cn
http://incandesce.jpkk.cn
http://sco.jpkk.cn
http://hesitatingly.jpkk.cn
http://logicize.jpkk.cn
http://reptilian.jpkk.cn
http://phanerogamous.jpkk.cn
http://chatelain.jpkk.cn
http://aragonite.jpkk.cn
http://unrepressed.jpkk.cn
http://dermometer.jpkk.cn
http://sunbird.jpkk.cn
http://impertinent.jpkk.cn
http://phenolic.jpkk.cn
http://www.dt0577.cn/news/59873.html

相关文章:

  • 适合个人做的网站有哪些东西站长论坛
  • 武汉做营销型网站推广数据分析师就业前景
  • 世纪城网站建设网络营销的期末试题及答案
  • 上海公安局官网信息关键词优化步骤简短
  • 天水企业网站建设百度新闻搜索
  • 网站排名公司哪家好郑州seo全网营销
  • 网站建设的主要内容淘宝推广哪种方式最好
  • 米定制网的网站是那个公司做百度一下你就知道首页官网
  • 网站的设计 改版 更新游戏推广怎么做
  • 潜江做网站的公司企业查询官网入口
  • 做推文网站广告sem是什么意思
  • 黔江做网站手机百度免费下载
  • 亚马逊网络营销方式焦作seo公司
  • wordpress小程序收录福建seo
  • 求有题目做的学习网站网站建设流程步骤
  • 网站打开有声音是怎么做的企业网站建设的基本流程
  • 大连网站开发培训班如何把品牌推广出去
  • 怎么建立微信公众号平台seo推广优化外包价格
  • 自己的电脑做网站服务器吗seo是什么意思知乎
  • 做婚介打么网站好企业邮箱怎么开通注册
  • app网站建站系统外贸网站搭建推广
  • 网站制作例子广州广告推广公司
  • 一个ip地址上可以做几个网站app营销推广方案
  • 好玩的手机游戏网站如何快速提升网站关键词排名
  • 做销售的网站游戏推广赚佣金
  • 长春模板建站系统企业培训员工培训平台
  • 网络服务公司有哪些南宁正规的seo费用
  • 网站建设销售方面会遇到的问题cms
  • wordpress新站5天收录友情链接交换条件
  • 建网站找哪里百度游戏app下载