今天我实现的是插入链表节点和删除链表节点。

看代码吧,注释写的不好的就见谅吧················· 

 

/* 
   
             链表节点的插入与删除

        编译环境:VC++ 6.0
        编译系统:windows XP SP3
 
   */ 
   

 #include <stdio.h> 
   
 #include <stdlib.h> 
   
 #include <malloc.h> 
   

// 
       定义链表中的节点 
   
typedef  
   struct node 
   
 { 
   
      
   int member;                 
   // 
       节点中的成员 
   
     
   struct node *pNext;         
   // 
       指向下一个节点的指针 
   
}Node,*pNode; 
   

// 
       函数声明 
   
pNode CreateList();                  
   // 
     创建链表函数 
   
 
   void TraverseList(pNode );             
   // 
     遍历链表函数 
   
 
   bool Insert_Node(pNode , 
   int , 
   int);     
   // 
       链表节点插入函数,第一个参数是头节点,第二个参数是要在第几个节点前插入,第三个参数是要插入的数据 
   
 
   int Del_Node(pNode, 
   int );         
   // 
       删除链表节点,第一个参数是头节点,第二个参数是删除第几个节点,第三个作为 
   
 
   int main() 
   
 { 
   
     pNode pHead = NULL;                 
   // 
     定义初始化头节点,等价于 struct Node *pHead == NULL 
   
     
   int data;                         
   // 
    作为Insert_Node函数的第三个参数 
   
     
   int num;                         
   // 
       作为Inset_Node函数第二个参数 
   
     
   int choose;     
   
      
   int return_val; 
   
     pHead = CreateList();             
   // 
     创建一个非循环单链表,并将该链表的头结点的地址付给pHead 
   
    printf( 
   " 
   你输入的数据是: 
   "); 
   
     TraverseList(pHead);     
   // 
     调用遍历链表函数 
   
    printf( 
   " 
   是否还要进行如下操作:\n 
   "); 
   
     printf( 
   " 
   1.插入数据      2.删除数据\n 
   "); 
   
     printf( 
   " 
   请输入: 
   "); 
   
     scanf( 
   " 
   %d 
   ",&choose); 
   
      
   switch (choose) 
   
     { 
   
          
   case  
   1: 
   
             { 
   
                 printf( 
   " 
   请输入要在第几个节点前插入数据: 
   "); 
   
                 scanf( 
   " 
   %d 
   ",&num); 
   
                 printf( 
   " 
   请输入要插入的数据: 
   "); 
   
                 scanf( 
   " 
   %d 
   ",&data); 
   
                  
   if(Insert_Node(pHead,num,data) ==  
   true) 
   
                 { 
   
                     printf( 
   " 
   插入成功\n插入后的数据是:\n 
   "); 
   
                     TraverseList(pHead); 
   
                 } 
   
                  
   else 
   
                 { 
   
                     printf( 
   " 
   插入失败\n 
   "); 
   
                 } 
   
                 printf( 
   " 
   操作完成后的数据是: 
   "); 
   
                 TraverseList(pHead); 
   
                  
   break; 
   
             } 
   
          
   case  
   2: 
   
             { 
   
                 printf( 
   " 
   请输入要删除第几个节点的数据: 
   "); 
   
                 scanf( 
   " 
   %d 
   ",&num); 
   
                 return_val = Del_Node(pHead,num); 
   
                  
   if (return_val ==  
   0) 
   
                 { 
   
                     printf( 
   " 
   删除失败。\n 
   "); 
   
                 } 
   
                  
   else 
   
                 { 
   
                     printf( 
   " 
   删除成功。删除的元素是:%d\n 
   ",return_val); 
   
                 } 
   
                 printf( 
   " 
   操作完成后的数据是: 
   "); 
   
                 TraverseList(pHead); 
   
             } 
   
     } 
   
      
   return  
   0; 
   
 } 
   

// 
       创建链表函数 
   
pNode CreateList() 
   
 { 
   
      
   int i;                                             
   // 
       用于下面循环 
   
     
   int len;                                         
   // 
       用来存放有效节点的字数 
   
     
   int val;                                         
   // 
       用于临时存放用户输入的数据 
   
    pNode pHead = (pNode)malloc( 
   sizeof(Node));         
   // 
     分配一个不存放有效数据的头结点 
   
    pNode pTail = pHead;                             
   // 
       链表的最后一个节点 
   
    pTail->pNext = NULL;                             
   // 
       最后一个节点的指针置为空 
   
    printf( 
   " 
   请输入节点个数: 
   "); 
   
     scanf( 
   " 
   %d 
   ",&len); 
   
      
   for(i =  
   0; i < len; i++) 
   
     { 
   
         printf( 
   " 
   第 %d 个节点的数值: 
   ",i+ 
   1); 
   
         scanf( 
   " 
   %d 
   ",&val); 
   
         pNode pNew = (pNode)malloc( 
   sizeof(Node));     
   // 
       为节点分配空间 
   
        pNew->member = val;                             
   // 
   将用户输入的数据赋给节点的成员 
   
        pTail->pNext = pNew;                         
   // 
   将最后一个节点的指针指向下一个新的节点 
   
        pNew->pNext = NULL;                             
   // 
   将新节点中的指针置为空 
   
        pTail = pNew;                                 
   // 
   将新节点赋给最后的一个节点 
   
    } 
   
      
   return pHead;                                     
   // 
   返回头节点 
   
 
   
 } 
   

// 
       遍历链表函数 
   
 
   void TraverseList(pNode pHead) 
   
 { 
   
     pNode p = pHead->pNext;                             
   // 
   将头节点的指针给予临时节点p 
   
     
   while(NULL != p)                                 
   // 
   节点p不为空,循环     
   
    { 
   
         printf( 
   " 
   %d  
   ",p->member);                     
   
         p = p->pNext;                                 
   
     } 
   
     printf( 
   " 
   \n 
   "); 
   
      
   return ; 
   
 } 
   

// 
       链表节点插入函数
 
   // 
       第一个参数是头节点,第二个参数是要在第几个节点前插入,第三个参数是要插入的数据 
   
 
   bool Insert_Node(pNode pHead,  
   int front, 
   int data) 
   
 { 
   
      
   int i =  
   0; 
   
     pNode _node = pHead; 
   
     pNode pSwap;                                 
   // 
       用于交换 
   
     
   if ((front <  
   1) && (NULL != _node))         
   // 
   判断用户输入的数据是否大于等于1,及_node是否为空 
   
    { 
   
          
   return  
   false; 
   
     } 
   
      
   while (i < front -  
   1)                     
   // 
   通过循环使指针指向要插入哪个节点前的节点。说的自己都不懂了,还是看下面的图吧。     
   
    { 
   
         _node = _node->pNext; 
   
         ++i; 
   
     } 
   
     pNode pNew = (pNode)malloc( 
   sizeof(Node)); 
   

     pNew->member = data;                         
   // 
       把输入的数据赋给要插入的节点 
   
    pSwap = _node->pNext;                         
   // 
       把下一个节点的地址,给用于交换的pSwap 
   
    _node->pNext = pNew;                         
   // 
       把要插入的节点的地址,给上个节点的指针域 
   
    pNew->pNext = pSwap;                         
   // 
       把插入节点的下一个节点的地址,给插入节点的指针域 
   
     
   return  
   true; 
   

 } 
   

// 
       删除链表节点函数
 
   // 
       第一个参数是头节点,第二个参数是要删除第几个节点·······和上面的插入函数是不是很像 
   
 
   int Del_Node(pNode pHead, 
   int back) 
   
 { 
   
      
   int i =  
   0; 
   
      
   int data; 
   
     pNode _node = pHead; 
   
     pNode pSwap; 
   
      
   if ((back <  
   1) && (NULL == _node->pNext)) 
   
     { 
   
         printf( 
   " 
   删除失败!\n 
   "); 
   
          
   return  
   0; 
   
     } 
   
      
   while(i < back- 
   1) 
   
     { 
   
         _node = _node->pNext; 
   
         ++i; 
   
     } 
   
     pSwap = _node->pNext; 
   
     data = pSwap->member; 
   
     _node->pNext = _node->pNext->pNext; 
   
     free(pSwap); 
   
      
   return 
  
 }



我自己也画了两张图片,帮助理解,反正我是这么理解的,有错的欢迎指出

先看下向链表中插入节点


C语言实现链表节点的插入和删除_数据

 

 

下面这个是删除链表节点


C语言实现链表节点的插入和删除_#include_02

 

欢迎各路神仙指正批评·············· 


----------------------------------------------在穷无非讨饭,不死终会出头。