链表简单功能的总结

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

头文件:

#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 );*/

}

相关推荐
Nydia.J1 小时前
【学习笔记】数据结构(十)
数据结构·考研
float_六七2 小时前
二叉树的二叉链表和三叉链表
数据结构·链表
Allo2022 小时前
数据结构——图
数据结构
麻瓜老宋3 小时前
【手搓一个脚本语言】七、用C语言抽象语法树AST实现一个可交互运行的表达式计算器
c语言·开发语言·数据结构·算法
HUT_Tyne2654 小时前
力扣904.水果成篮
数据结构·算法·leetcode
星迹日4 小时前
数据结构:LinkedList与链表—无头双向链表(二)
java·数据结构·经验分享·笔记·链表·双向链表
澄岚明雪4 小时前
力扣经典题目之219. 存在重复元素 II
java·数据结构·算法·leetcode·职场和发展
Unique_yt4 小时前
1.07 标准IO
数据结构·算法
tt5555555555556 小时前
多链表合并
数据结构·链表
Rossy Yan13 小时前
【C++数据结构——查找】二分查找(头歌实践教学平台习题)【合集】
开发语言·数据结构·c++·算法·查找·头歌实践教学平台·合集