步骤如下:
- 情况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 ); // 借书离开
}
}
/* ------------链表内结点的删除------------- */
#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