下面我将通过创建链表,实现链表的增删,打印,对链表进行复习
头文件:
#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 );*/
}