C语言链表求助!双链表删除结点


#include <stdio.h>
#include <stdlib.h>
 
struct  node {
     int  value;
     struct  node * prior;
     struct  node * next;
};
 
struct  node * in_link( void );    //创建一个双向链表
void  print_link( struct  node * head);
struct  node * delete_link( struct  node * head,  int  i);   //删除链表结点
void  get( struct  node * head,  int  i, struct  node **pDel);
 
int  main( void )
{
     int  i, y;
     struct  node * head;
     head = in_link();
     print_link(head);
     printf ( "你想删除数据在链表的第几个数据: " );
     scanf ( "%d" , &i);
     head = delete_link(head, i);
     print_link(head);
     return  0;
}
 
struct  node * in_link( void )
{
     struct  node *head, *temp, *add_temp;
     int  n, i;
     printf ( "您想插入几个数据: " );
     scanf ( "%d" , &n);
     head = ( struct  node *)  malloc ( sizeof ( struct  node));
     if  (head == NULL) {
         printf ( "分配内存失败\n" );
         exit  (EXIT_FAILURE);
     }
     printf ( "请输入链表的第1个数据: " );
     scanf ( "%d" , &head->value);
     head->next = NULL;
     head->prior = NULL;
     temp = head;
     for  (i = 2;i <= n;i++) 
     {
         add_temp = ( struct  node *)  malloc ( sizeof ( struct  node));  //动态分配内存空间
         if  (add_temp == NULL) 
         {
             printf ( "内存分配失败\n" );
             exit  (EXIT_FAILURE);
         }
         printf ( "请输入链表的第%d个数据: " , i);
         scanf ( "%d" , &add_temp->value);
         add_temp->next = NULL;
         /* 给prior赋值,将其指向其前一个节点 */
         add_temp->prior = temp;
         temp->next = add_temp;
         temp = temp->next;
     }
     return  head;
}
 
void  print_link( struct  node * head)
{
     while  (head != NULL) {
         printf ( "%d " , head->value);
         head = head->next;
     }
     printf ( "\n" );
}
 
/* 想通过返回值来获取指定节点需用二级指针来实现,不建议使用,易出错 */
void  get( struct  node * head,  int  i, struct  node **pDel)    //将你想删除的数据取出
{
     struct  node * temp;
     int  j = 1;
     *pDel = head;
     while  (*pDel != NULL && j < i) {
         *pDel = (*pDel)->next;
         j++;
     }
     printf ( "%d\n" , (*pDel)->value);
}
 
struct  node * delete_link( struct  node * head,  int  i)     //删除取出的数据,调用了get函数
{
     struct  node * temp;
     get(head, i,&temp);
     temp->prior->next = temp->next;
     temp->next->prior = temp->prior;
     free (temp);
     return  head;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值