链表简单功能的总结

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

头文件:

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

}

相关推荐
熬了夜的程序员2 小时前
【LeetCode】109. 有序链表转换二叉搜索树
数据结构·算法·leetcode·链表·职场和发展·深度优先
立志成为大牛的小牛3 小时前
数据结构——四十一、分块查找(索引顺序查找)(王道408)
数据结构·学习·程序人生·考研·算法
前端小L5 小时前
二分查找专题(九):“降维”的魔术!将二维矩阵“拉平”为一维
数据结构·算法
她说人狗殊途5 小时前
时间复杂度(按增长速度从低到高排序)包括以下几类,用于描述算法执行时间随输入规模 n 增长的变化趋势:
数据结构·算法·排序算法
Miraitowa_cheems5 小时前
LeetCode算法日记 - Day 102: 不相交的线
数据结构·算法·leetcode·深度优先·动态规划
野生技术架构师5 小时前
盘一盘Redis的底层数据结构
数据结构·数据库·redis
Miraitowa_cheems5 小时前
LeetCode算法日记 - Day 101: 最长公共子序列
数据结构·算法·leetcode·深度优先·动态规划
北冥湖畔的燕雀5 小时前
std之list
数据结构·c++·list
南方的狮子先生6 小时前
【C++】C++文件读写
java·开发语言·数据结构·c++·算法·1024程序员节
Alex艾力的IT数字空间7 小时前
完整事务性能瓶颈分析案例:支付系统事务雪崩优化
开发语言·数据结构·数据库·分布式·算法·中间件·php