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