数据结构 单链表删除结点 例子

单链表的删除是将下一个节点移到待删除的节点上,只需移动这两个位置,其他的位置不用变化,这也是链表的优点。而数组的删除则是将待删除数值之后的所有数据移动一遍。

下面的程序是按照位置对链表的数值进行删除。

#include <stdio.h>  
#include <malloc.h>  
#include <time.h>
  
typedef struct list  
{  
    int vaule; //数据域  
    struct list *PNext; //指针域  
}TNODE, *TPNODE;  
  
TPNODE Creat_list();  
void Trave_list(TPNODE _PHead);  
int Delete_List(TPNODE _pHead, int _pos, int  *_iVal);

int main()  
{  
    int iVal = 0;
    int pos = 0;
    TPNODE PHead;
    srand((int)time(NULL));
    
    PHead = Creat_list();   //创建链表
    Trave_list(PHead);   //遍历链表
    
    printf("please input delete pos\n"); //想删除第几个数值
    scanf("%d", &pos);

    if(1 == Delete_List(PHead, pos, &iVal))//删除链表
    {
        printf("Delete fail\n");
    }
    else
    {
        Trave_list(PHead);   //遍历链表
        printf("%d had Delete\n", iVal); //输出刚才被删除的数值
    }
    
    return 0;  
}  
  
//创建链表  
TPNODE Creat_list()  
{  
    int i = 0;  
    int len = 0;  
    int iVaule = 0;  
  
    TPNODE pHead;  
    pHead = (TPNODE)malloc(sizeof(TNODE));  //创建一个头结点  
    if(NULL == pHead)   //创建失败
    {  
        printf("create list fail\n");  
    }  
  
    TPNODE PTail = pHead;  
    pHead->PNext = NULL;  
      
    printf("please input len of list\n");  
    scanf("%d", &len);  //输入想要的个数
    for(i = 0; i < len; i++)  
    {  
        iVaule = rand()%100+1;
  
        TPNODE pNew = (TPNODE)malloc(sizeof(TNODE)); //分配内存
          
        pNew->vaule = iVaule;  //将数据域赋予数据  
        PTail->PNext = pNew;  
        pNew->PNext = NULL;  
        PTail = pNew;  
    }  
      
    return  pHead;  
}  
      
//链表输出  
void Trave_list(TPNODE _PHead)  
{  
    int i = 0;
    TPNODE P = _PHead->PNext;  
  
    while(NULL != P)  
    {  
        i = 1;
        printf("%d ", P->vaule);  
        P = P->PNext;  
    }  
    if(1 == i)
    {
        printf("\n");
    }
}  

//链表删除
int Delete_List(TPNODE _pHead, int _pos, int  *_iVal)
{
    int i = 0;
    TPNODE p = _pHead;
    while(NULL != p->PNext && i < _pos-1)
    {
        p = p->PNext;
        //printf("val: %d\n", p->vaule);
        i++;
    }

   if(i > _pos -1 || NULL == p->PNext)
   {
        return 1; 
   }

    TPNODE q = p->PNext;
    *_iVal = p->PNext->vaule;
    p->PNext = p->PNext->PNext; //将待删除节点后面的一个节点放到待删除节点的位置
    
    free(q);
    q = NULL;
    return 0;
}
此程序的运行结果:



创建链表:http://blog.csdn.net/z_dream_st/article/details/77142223

链表的插入:http://blog.csdn.net/z_dream_st/article/details/77726255

发布了35 篇原创文章 · 获赞 18 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/Z_Dream_ST/article/details/77938850