Tableau à chaîne unique [structure des données]

Iceevov 2022-05-14 11:59:00 阅读数:305

tableauchaneuniquestructure

1.Concept et structure de la liste de liens

1.1Concept

Une liste liée est une structure de stockage physique discontinue、Structure de stockage non séquentielle,L'ordre logique des éléments de données passe par une liste liée
L'ordre des liens de pointeur est implémenté dans.

La structure de la liste est similaire à celle du train,Le noeud de tête est l'équivalent d'une locomotive,Chaque noeud est comme chaque voiture,Connecté entre eux,Mais l'adresse physique de la liste ici n'est pas nécessairement continue,Structure logique continue,Je vais vous montrer.
 

La figure montre une liste de liens unidirectionnels sans boucle oùplistC'est là qu'il est stocké.node1Adresse,node1À l'intérieur.nextCe qui est stockénode2Adresse,Pointer vers le deuxième noeud,Pointez vers le bas dans l'ordre,Dernier noeudnode4DenextPointé versNULLReprésente la fin de la liste .

1.2Structure

Unidirectionnel et bidirectionnel :

Prendre l'initiative et ne pas prendre l'initiative: 

 Cycle et non - cycle:

.Voici une liste de liens unidirectionnels et non circulaires sans tête : L'article précédent présente le tableau des séquences , Et face à la liste, nous devons insérer des données pour créer un noeud , Il n'y a donc pas de gaspillage face à l'espace , Peut - être que quelqu'un pourrait dire qu'il serait lent d'être aussi efficace tout le temps , En fait, cette question n'a pas besoin de beaucoup d'attention , Parce que le matériel informatique actuel est également relativement développé , C'est une chose qui tourne en un instant . Voici la structure de cette liste en Code :

// Renommer le type de données , Si vous voulez remplacer int Il suffit de changer le type ici intC'est tout.
typedef int SLTDateType;
typedef struct SListNode
{
SLTDateType data;
struct SListNode* next;//Pointez vers le noeud suivant
}SListNode;

2. Réalisation de la fonction de liste à chaîne unique

2.1Créer un nouveau noeud

//Créer un nouveau noeud
SListNode* SLBuyNode(SLDataType x)
{
SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
if (newnode == NULL)
{
perror("malloc");
exit(-1);
}
newnode->data = x;
newnode->next = NULL;
return newnode;
}

2.2Supprimer 

Pour supprimer une liste à chaîne unique, il suffit de free Laisser tomber les noeuds à supprimer , Ensuite, Connectez la liste de liens ,Pas besoin de déplacer les données. 

2.2.1Tailgate 

//Tailgate
void SListPopBack(SListNode** pphead)
{
if (*pphead == NULL)
{
free(*pphead);
*pphead = NULL;
}
else
{
SListNode* tail = *pphead;
while (tail->next->next != NULL)
{
tail = tail->next;
}
free(tail->next);
tail->next = NULL;
}
}

2.2.2Tête coupée

//Tête coupée
void SListPopFront(SListNode** pphead)
{
assert(*pphead);
SListNode* next = (*pphead)->next;
free(*pphead);
*pphead = next;
}

2.2.3 Supprimer après l'emplacement spécifié  

//InposSupprimer après
void SListEraseAfter(SListNode* pos)
{
assert(pos);
if (pos->next == NULL)
return;
SListNode* next = pos->next;
pos->next = next->next;
free(next);
next = NULL;
}

 2.3Insérer des données

Une table à chaîne unique doit créer un nouveau noeud pour insérer des données , Et lier les liens avant et arrière à l'endroit où vous voulez insérer ,C'est - à - dire l'utilisationnext Un lien vers .

2.3.1Insertion caudale 

//Insertion caudale
void SLPushBack(SListNode** pplist, SLDataType x)
{
assert(*pplist);
SListNode* newnode = SLBuyNode(x);
if (*pplist == NULL)
{
*pplist = newnode;
}
else
{
SListNode* tail = *pplist;
while (tail->next != NULL)
{
tail = tail->next;
}
tail->next = newnode;
}
}

2.3.2Tête insérée

//Tête insérée
void SLPushFront(SListNode** pplist, SLDataType x)
{
assert(*pplist);
SListNode* tail = SLBuyNode(x);
tail->next = *pplist;
// Changer l'en - tête de la liste en un nouveau noeud
*pplist = tail;
}

2.3.3 Insérer après la position spécifiée

//InposInsérer après
void SListInsertAfter(SListNode* pos, SLDataType x)
{
assert(pos);
SListNode* newnode = SLBuyNode(x);
newnode->next = pos->next;
pos->next = newnode;
}

2.4Trouver

  Nous cherchons l'emplacement actuel à partir des données spécifiées , Renvoie l'adresse du noeud courant lorsqu'elle est trouvée , En parcourant la liste ,Comparer chaque noeuddataOui Non etXÉquivalence.Si vous ne le trouvez pas, retournez àNULLNon..

//Trouver
SListNode* SListFind(SListNode* plist, SLDataType x)
{
assert(plist);
SListNode* cur = plist;
while (cur)
{
if (cur->data == x)
{
printf("J'ai trouvé.\n");
return cur;
}
cur = cur->next;
}
return NULL;
}

2.5Modifier les données

Ici, les données sont modifiées pour être utilisées avec la recherche , Lorsque nous avons trouvé l'adresse des données à modifier, nous les avons directement data Devient la couverture de données dont nous avons besoin . 

//Modifier
void SListModify(SListNode* pos, SLDataType x)
{
assert(pos);
pos->data = x;
}

La liste est là , L'article suivant présente les questions classiques de l'examen écrit de la liste à chaîne unique .

Copyright:Cet article est[Iceevov]Établi,Veuillez apporter le lien original pour réimprimer,remercier。 https://fra.fheadline.com/2022/134/202205141151287441.html