链表简单功能的总结

下面我将通过创建链表,实现链表的增删,打印,对链表进行复习

头文件:

#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

typedef struct ListNode

{

int data;

struct ListNode* next;

}SLI;

SLI* create(int x);

void ADDFRONT( SLI** head , int x );

void PRINT( SLI* head );

void ADDTAIL( SLI** head ,int x );

void DELETEFRONT( SLI** head );

void DELETETAIL( SLI** head );

SLI* FIND( SLI* head ,int x );

void ADD_SPECIFICFRONT(SLI** head , SLI* pos ,int x );

void ADD_SPECIFICTAIL(SLI** head , SLI* pos ,int x );

void DELETE_SPECIFIC( SLI** head , SLI* pos );

具体实现的函数:

#include "SList.h"

SLI* create(int x)

{

SLI* pf = (SLI*)malloc(sizeof(SLI));

if( pf == NULL )

{

perror("fail");

exit(1);

}

pf->data = x;

pf->next = NULL;

return pf;

}

void ADDFRONT( SLI** head , int x )

{

SLI* pf = create(x);

if( (*head) == NULL )

*head = pf;

else

{

pf->next = *head;

*head = pf;

}

}

void PRINT( SLI* head )

{

while( head )

{

printf("%d->",head->data);

head = head->next ;

}

printf("NULL\n");

}

SLI* FINDTAIL(SLI** head)

{

SLI* pf = *head;

while( pf->next != NULL )

{

pf = pf->next;

}

return pf;

}

void ADDTAIL( SLI** head ,int x )

{

SLI* pf = create(x);

SLI* tail = NULL;

assert(head);

if( *head == NULL )

{

*head = pf;

}

else

{

tail = FINDTAIL(head);

tail->next = pf;

}

}

void DELETEFRONT( SLI** head )

{

SLI* pf = (*head)->next;

assert(head);

assert(*head);

free(*head);

*head = pf;

}

void DELETETAIL( SLI** head )

{

SLI* pf = *head;

assert(head);

assert(*head);

if( (*head)->next == NULL )

{

return;

}

else

{

while( pf->next->next != NULL )

{

pf = pf->next ;

}

pf->next = NULL;

return;

}

}

void ADD_SPECIFICFRONT(SLI** head , SLI* pos ,int x )

{

SLI* a = *head;

SLI* pf = create(x);

assert(head);

assert(*head);

assert(pos);

if( pos == *head )//相当与头插

{

ADDFRONT( head , x );

return;

}

while( (*head)->next != pos )

{

*head = (*head)->next ;

}

pf->next = (*head)->next ;

(*head)->next = pf;

*head = a;

}

SLI* FIND( SLI* head ,int x )

{

while( head )

{

if(head->data == x)

return head;

head = head->next ;

}

return NULL;

}

void ADD_SPECIFICTAIL(SLI** head , SLI* pos ,int x )

{

SLI* pf = create(x);

if( pos->next == NULL )

{

pos->next = pf;

return;

}

else

{

pf->next = pos->next ;

pos->next = pf;

return;

}

}

void DELETE_SPECIFIC( SLI** head , SLI* pos )

{

SLI* pf = *head;

if( *head == pos )//当pos为首节点

{

*head = (*head)->next ;

free(pf);

pf = NULL;

return;

}

while( pf->next != pos )

{

pf = pf->next;

}

pf->next = pf->next->next ;

}

测试函数:这里可以随意实现

#include "SList.h"

int main()

{

SLI* pf;

SLI* head = NULL;

//ADDFRONT( &head , 1 );

//ADDFRONT( &head , 2 );

//ADDFRONT( &head , 3 );

ADDTAIL( &head ,1);

ADDTAIL( &head ,2);

ADDTAIL( &head ,3);

pf = FIND( head ,1 );

DELETE_SPECIFIC(&head,pf);

//ADD_SPECIFICTAIL(&head , pf ,2 );

PRINT( head );

/*PRINT( head );

DELETETAIL( &head );

DELETEFRONT( &head );

PRINT( head );*/

}

相关推荐
_OP_CHEN5 小时前
C++基础:(十二)list类的基础使用
开发语言·数据结构·c++·stl·list类·list核心接口·list底层原理
(●—●)橘子……10 小时前
记力扣2009:使数组连续的最少操作数 练习理解
数据结构·python·算法·leetcode
GalaxyPokemon10 小时前
LeetCode - 1171.
算法·leetcode·链表
iナナ10 小时前
Java优选算法——位运算
java·数据结构·算法·leetcode
Han.miracle11 小时前
数据结构二叉树——层序遍历&& 扩展二叉树的左视图
java·数据结构·算法·leetcode
筱砚.11 小时前
【数据结构——最小生成树与Kruskal】
数据结构·算法
蒙奇D索大12 小时前
【数据结构】考研数据结构核心考点:平衡二叉树(AVL树)详解——平衡因子与4大旋转操作入门指南
数据结构·笔记·学习·考研·改行学it
im_AMBER14 小时前
数据结构 04 栈和队列
数据结构·笔记·学习
CAU界编程小白16 小时前
数据结构系列之堆
数据结构·c
CoderCodingNo16 小时前
【GESP】C++五级考试大纲知识点梳理, (3-4) 链表-双向循环链表
开发语言·c++·链表