2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Hi~! Hic est laborans ovicula. Ego honoratus sum ut articulum meum legere possis
💥💥个人主页:Luctantem agnus
💥💥所属专栏:C lingua
🚀本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为展示我的学习过程及理解。文笔、排版拙劣,望见谅。
Unius connexus index nonnisi in unam partem per electronicam cuiusdam nodi accedere potest, dum duplex index accessus notitiarum in utramque partem per electronicam nodi potest. Sed signum exsecutionis simplicius est quam in indice singulari coniunctorum.
Tabulae conexae in octo genera dividuntur: capitatus, non capitus, unus modus, bivium, cyclicum, et non-cyclicum.Uno modo non-cyclica coniunctum album sine duceetVirens duos modos circularis coniunctum album, ille estUnius indexetBis coniunctum album。
Bis album coniunctum:
Nam in superiori articulo, primum nodi coniunctionis album caput nodi appellavimus, quod est inconveniens solum album duplicatum coniunctum caput nodi habetVigil positio。
- Data reposita in nodo capitis in indice duplici coniunctorum non est valida, sed inrita data.
- Vigiliae positio mutari non potest, sed eius directio mutari potest.
Nodi indices duplicium coniunctorum necessariae sunt ad reponendas notitias, sicut ad inscriptiones nodi prioris et sequentis.
typedef int dlist_data_type;
//双向链表节点
typedef struct dlist
{
dlist_data_type data;
struct dlist* next
struct dlist* prev;
}dlist;
Album dissimile coniunctum, album duplex coniunctum habere debet saltem unam nodi, quae est nodi caput, etiam positio vigilis appellata.
Priusquam addere, delendo, tenendo vel modificando;Album duplex coniunctum initialem vigili frenum, et vigiliae frenum in promptu notitiae invalidae sunt.
Nodus applicatus initio duos indices sibi demonstratos habet.。
//申请节点
dlist* dlist_buy(dlist_data_type x)
{
dlist* newdlist = (dlist*)malloc(sizeof(dlist));
if (newdlist == NULL)
{
perror("malloc fail!");
return 1;
}
newdlist->data = x;
newdlist->next = newdlist;
newdlist->prev = newdlist;
return newdlist;
}
Dupliciter initialize vigiliarum;
Reversi ad parametri:
void dlist_init(dlist** pphead)
{
assert(pphead);
*pphead = dlist_buy(-1);
}
Haec methodus usum indicibus secundariis requirit.
Reditus in valorem:
dlist* dlist_init()
{
dlist* phead = dlist_buy(-1);
return phead;
}
Haec methodus simplicior ac facilior est ad intelligendum.
Typographia et perscrutatio notitiarum non multum discrepant ab illa indicem singularum coniunctorum, quare in details non ingrediar.
Sola res quae attentione indiget condicio est ad ansam finiendam. Ansa desinit cum monstratorem ad frenum vigilis ostendit, quam cum monstratorem ad frenum vigilis ostendit.NULL
。
//打印数据
void dlist_print(dlist* phead)
{
assert(phead);
dlist* pcur = phead->next;
while (pcur != phead)
{
printf("%d->", pcur->data);
pcur = pcur->next;
}
printf("NULLn");
}
//查找
dlist* dlist_find(dlist* phead, dlist_data_type x)
{
assert(phead);
dlist* pcur = phead->next;
while (pcur != phead)
{
if (pcur->data == x)
{
return pcur;
}
pcur = pcur->next;
}
return NULL;
}
Diversae ab unoquoque nexu, additamento, deletione, interrogatione et modificatione operationum indices duplicis coniunctorum non mutabunt partem vigiliarum, ergo solumvocate a valoremId est.
Operatio in indice coniunctorum duplicium insertio modificationem trium nodis requiritNovum nodi primum mutare, deinde nodi proximum mutare, ac tandem priorem nodi mutare.
//插入操作不改变哨兵位,因此传一级指针即可
//尾插
void dlist_push_back(dlist* phead, dlist_data_type x)
{
assert(phead);
dlist* newdlist = dlist_buy(x);
//新尾节点
newdlist->prev = phead->prev;
newdlist->next = phead;
//旧尾节点
phead->prev->next = newdlist;
//头节点(哨兵位)
phead->prev = newdlist;
}
//头插
void dlist_push_front(dlist* phead, dlist_data_type x)
{
assert(phead);
dlist* newdlist = dlist_buy(x);
//新节点
newdlist->prev = phead;
newdlist->next = phead->next;
//旧节点
phead->next->prev = newdlist;
//哨兵位
phead->next = newdlist;
}
Praevia deletionis operatio est quod nodos esse non potest.Vigil positio non computat) , antequam delendo, adhuc salva inscriptione nodi, indicem coniunctum duplices repete et nodo emittere.
//尾删
void dlist_pop_back(dlist* phead)
{
assert(phead);
assert(phead->next != phead);//双向链表不能为空
dlist* del = phead->prev;
//新尾节点
del->prev->next = phead;
//哨兵位
phead->prev = del->prev;
free(del);
del = NULL;
}
//头删
void dlist_pop_front(dlist* phead)
{
assert(phead);
assert(phead->next != phead);
dlist* del = phead->next;
del->next->prev = phead;
phead->next = del->next;
free(del);
del = NULL;
}
//在指定位置之后插入数据
void dlist_insert_back(dlist* pos, dlist_data_type x)
{
assert(pos);
dlist* newdlist = dlist_buy(x);
newdlist->prev = pos;
newdlist->next = pos->next;
pos->next->prev = newdlist;
pos->next = newdlist;
}
//删除指定位置的节点
void dlist_erase(dlist* pos)
{
assert(pos);
dlist* del = pos;
pos->prev->next = pos->next;
pos->next->prev = pos->prev;
free(pos);
pos = NULL;
}
Deletis notitia ad certum locumQuia hoc munus per valorem vocatur, postquam nodi in determinato positio dimittuntur, modulum formalem monstratorem ad modum constituimus.NULL
atque monstrator ipse modulus hunc locum adhuc demonstrat, ut, finito functione vocationis fine, modulus ipse monstrator constituendus sit.NULL
。
Finis conditio pro duplici coniunctione lista destruendi est ansam erumpere cum monstratorem traversalem ad nodi caput monstrat.Postremo custodiae positio separatim dimitti debetfunctio vocationi e electronico duplici coniunctorum completo destructo, monstrator ad stationem vigilis indicandus statuendus est.NULL
。
//销毁
void dlist_destroy(dlist* phead)
{
assert(phead);
dlist* pcur = phead->next;
while (pcur != phead)
{
dlist* next = pcur->next;
free(pcur);
pcur = next;
}
free(pcur);
pcur = NULL;
}
dlist.h:
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int dlist_data_type;
//双向链表节点
typedef struct dlist
{
dlist_data_type data;
struct dlist* next;
struct dlist* prev;
}dlist;
//初始化
//插入数据之前,双向链表必须初始化到只有一个头节点(哨兵位)
//void dlist_init(dlist** pphead);//以参数的形式返回
dlist* dlist_init();//以返回值的形式返回
//打印数据
void dlist_print(dlist* phead);
//查找
dlist* dlist_find(dlist* phead, dlist_data_type x);
//尾插
void dlist_push_back(dlist* phead, dlist_data_type x);
//头插
void dlist_push_front(dlist* phead, dlist_data_type x);
//尾删
void dlist_pop_back(dlist* phead);
//头删
void dlist_pop_front(dlist* phead);
//在指定位置之后插入数据
void dlist_insert_back(dlist* pos, dlist_data_type x);
//删除指定位置的节点
void dlist_erase(dlist* pos);
//销毁
void dlist_destroy(dlist* phead);
dlist.c:
#define _CRT_SECURE_NO_WARNINGS
#include "dlist.h"
//申请节点
dlist* dlist_buy(dlist_data_type x)
{
dlist* newdlist = (dlist*)malloc(sizeof(dlist));
if (newdlist == NULL)
{
perror("malloc fail!");
return 1;
}
newdlist->data = x;
newdlist->next = newdlist;
newdlist->prev = newdlist;
return newdlist;
}
//初始化
//void dlist_init(dlist** pphead)
//{
// assert(pphead);
// *pphead = dlist_buy(-1);
//}
dlist* dlist_init()
{
dlist* phead = dlist_buy(-1);
return phead;
}
//打印数据
void dlist_print(dlist* phead)
{
assert(phead);
dlist* pcur = phead->next;
while (pcur != phead)
{
printf("%d->", pcur->data);
pcur = pcur->next;
}
printf("NULLn");
}
//查找
dlist* dlist_find(dlist* phead, dlist_data_type x)
{
assert(phead);
dlist* pcur = phead->next;
while (pcur != phead)
{
if (pcur->data == x)
{
return pcur;
}
pcur = pcur->next;
}
return NULL;
}
//插入操作不改变哨兵位,因此传一级指针即可
//尾插
void dlist_push_back(dlist* phead, dlist_data_type x)
{
assert(phead);
dlist* newdlist = dlist_buy(x);
//新尾节点
newdlist->prev = phead->prev;
newdlist->next = phead;
//旧尾节点
phead->prev->next = newdlist;
//头节点(哨兵位)
phead->prev = newdlist;
}
//头插
void dlist_push_front(dlist* phead, dlist_data_type x)
{
assert(phead);
dlist* newdlist = dlist_buy(x);
//新节点
newdlist->prev = phead;
newdlist->next = phead->next;
//旧节点
phead->next->prev = newdlist;
//哨兵位
phead->next = newdlist;
}
//尾删
void dlist_pop_back(dlist* phead)
{
assert(phead);
assert(phead->next != phead);//双向链表不能为空
dlist* del = phead->prev;
//新尾节点
del->prev->next = phead;
//哨兵位
phead->prev = del->prev;
free(del);
del = NULL;
}
//头删
void dlist_pop_front(dlist* phead)
{
assert(phead);
assert(phead->next != phead);
dlist* del = phead->next;
del->next->prev = phead;
phead->next = del->next;
free(del);
del = NULL;
}
//在指定位置之后插入数据
void dlist_insert_back(dlist* pos, dlist_data_type x)
{
assert(pos);
dlist* newdlist = dlist_buy(x);
newdlist->prev = pos;
newdlist->next = pos->next;
pos->next->prev = newdlist;
pos->next = newdlist;
}
//删除指定位置的节点
void dlist_erase(dlist* pos)
{
assert(pos);
dlist* del = pos;
pos->prev->next = pos->next;
pos->next->prev = pos->prev;
free(pos);
pos = NULL;
}
//销毁
void dlist_destroy(dlist* phead)
{
assert(phead);
dlist* pcur = phead->next;
while (pcur != phead)
{
dlist* next = pcur->next;
free(pcur);
pcur = next;
}
free(pcur);
pcur = NULL;
}
test.c:
#define _CRT_SECURE_NO_WARNINGS
#include "dlist.h"
void test()
{
//dlist* plist = NULL;
//dlist_init(&plist);
dlist* plist = dlist_init();
//尾插
dlist_push_back(plist, 1);
dlist_push_back(plist, 2);
dlist_push_back(plist, 3);
dlist_print(plist);
//头插
//dlist_push_front(plist, 1);
//dlist_push_front(plist, 2);
//dlist_push_front(plist, 3);
//dlist_print(plist);
//尾删
//dlist_pop_back(plist);
//dlist_pop_back(plist);
//dlist_pop_back(plist);
//dlist_print(plist);
//头删
//dlist_pop_front(plist);
//dlist_print(plist);
//dlist_pop_front(plist);
//dlist_print(plist);
//dlist_pop_front(plist);
//dlist_print(plist);
//dlist* find = dlist_find(plist, 2);
//dlist_insert_back(find, 4);
//dlist_print(plist);
//dlist* find = dlist_find(plist, 2);
//dlist_erase(find);
//find = NULL;
//dlist_print(plist);
dlist_destroy(plist);
plist = NULL;//手动置空
}
int main()
{
test();
return 0;
}
Sequentia mensa | Album coniunctum (duplex coniunctum album) | |
---|---|---|
In repono spatium | logice et corporaliter continua | Logice continua, non necessario physice continua |
temere accessum | Complexion O(1) | Complexionem O (N) |
Data usquam inserere aut delere | Data moveri debet, multiplicitate O (N) | Sicut mutare monstratorem |
inserta | Sequentia dynamica tabula dilatetur cum spatium insufficiens est. | Nulla conceptio capacitatis |
Application missiones | Efficiens notitia repono + crebris accessibus | Saepe inserere et delere notitia ad aliquem locum |
cache utendo | summus | low |
Sequentiae indices et indicem coniunctorum habent commoda complementaria et suas quisque utilitates in variis missionibus applicationis exercere possunt.
- Si applicatio missionis frequentem inquisitionem et operationes deletas requirit et plus memoriae consumptionem capere potest, duplex index coniunctus aptior erit.
- Si memoria limitata est vel potentia inquisitionis et operationum deletarum alta non est, album singulare coniunctum aptius esse potest.