链表的删除(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://www.cnblogs.com/FCWORLD/archive/2010/11/19/1881586.html

猜你喜欢

转载自blog.csdn.net/weixin_33753003/article/details/94156041