链表的删除(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/p/1881586.html