链表的删除(3)

步骤如下:

  • 情况1:删除链表内的第一个结点

        只需将链表结构指针只需下一个结点。

  • 情况2:删除链表内的最后一个结点

       只要将指向最后一个结点的结构指针指向NULL。

  • 情况3:删除链表内的中间结点

       只要将删除结点的结构指针,指向删除结点后的下一个结点。

   

链表内结点删除

    

/* ------------链表内结点的删除------------- */

#include
" stdio.h "
#include
" stdlib.h "

struct llist
{
int num;
struct llist * next;

};
typedef
struct llist node;
typedef node
* llink;


/* ------------链表的输出---------- */

void printfllist( llink ptr)
{
while (ptr != NULL)
{
printf(
" [%d] " ,ptr -> num);
ptr
= ptr -> next;

}
printf(
" \n " );
}

/* --------链表的创建-------- */

llink createllist(
int * array , int len)
{
llink head;
llink ptr,ptr1;
int i;


/* ------创建第一个结点------ */

head
= (llink)malloc( sizeof (node));
if ( ! head)
return NULL;
head
-> num = array[ 0 ];
head
-> next = NULL;
ptr
= head;
for (i = 1 ;i < len;i ++ )
{
ptr1
= (llink)malloc( sizeof (node));
if ( ! ptr1)
return NULL;
ptr1
-> num = array[i];
ptr1
-> next = NULL;
ptr
-> next = ptr1;
ptr
= ptr -> next;
}
return head;
}
/* -----链表的结点遍历----- */
llink findnode(llink head,
int num)
{
llink ptr;
ptr
= head; // 指向链表起始
while (ptr != NULL) // 遍历链表
{
if (ptr -> num == num) // 查找编号
return ptr;
ptr
= ptr -> next; // 指向下一个结点
}
return ptr;
}


/* ------链表的结点删除-------- */

llink deletenode( llink head,llink ptr)
{

llink previous;
// 指向前一节点

if (ptr == head) // 是否是链表开始
/* --情况1: 删除第一个结点-- */

return head -> next; // 输入第二节点指针
else
{
previous
= head;
while (previous -> next != ptr) // 找结点ptr的前结点
previous = previous -> next;

if (ptr -> next == NULL) // 是否是链表结束
/* --情况2:删除最后一个结点-- */
previous
-> next = NULL; // 最后一个结点
else
/* --情况3:删除中间结点-- */

previous
-> next = ptr -> next; // 中间结点

}
return head;

}


/* -----删除结点----- */

int main()
{
int llist[ 6 ] = { 1 , 2 , 3 , 4 , 5 , 6 };

llink head,ptr;
int num; // 邮寄编号变量

head
= createllist(llist, 6 );
if ( ! head)
{
printf(
" 内存分配失败!\n " );
exit(
1 );
}
printf(
" 原来的链表: " ); // 输出原来的链表

printfllist(head);
while ( 1 )
{
printf(
" 请输入要删除的邮寄编号 ==> " );
scanf(
" %d " , & num); // 读取邮编号
if (num !=- 1 )
{
ptr
= findnode(head,num); // 查找邮编号
if ( ! ptr) // 是否找到
printf( " 没有找到\n " );
else
{
head
= deletenode(head,ptr); // 删除此结点
printf( " 删除后链表: " ); // 输出删除后链表
printfllist(head);
}
}
else
exit(
1 ); // 借书离开
}
}

 

转载于:https://my.oschina.net/garyun/blog/602869

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值