题目要求:
//输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。
//链表结点定义如下:
//struct ListNode
//{
// int m_nKey;
// ListNode* m_pNext;
//};
//详细描述:
//本题为考察链表的插入和删除知识。
//链表的值不能重复
//构造过程,例如(输入样例)
//2
//1 -> 2
//3 -> 2
//5 -> 1
//4 -> 5
//7 -> 2
//最后的链表的顺序为 2 7 3 1 5 4
//删除 结点 2
//则结果为 7 3 1 5 4
#include <stdio.h>
#include <stdlib.h>
struct ListNode
{
int m_nKey;
struct ListNode* m_pNext;
};
int main(void){
int node_num,k,node_data_temp,node_next_data,del_node_data;
struct ListNode *listhead, *node_next, *node_before;
scanf("%d", &node_num);
if(node_num<=0) return 0;
if((listhead=(struct ListNode*)malloc(sizeof(struct ListNode)*node_num))==NULL)
return 0;
for(k=0; k<node_num; k++){
if(k==0){
scanf("%d", &node_data_temp);
listhead->m_nKey = node_data_temp;
listhead->m_pNext = NULL;
}
else{
scanf("%d %d", &node_data_temp, &node_next_data);
node_next=listhead->m_pNext;
node_before=listhead;
while(node_before-listhead<k){
if(node_before->m_nKey == node_next_data){ //找到需要指向的元素并向后插入
if(node_next==NULL){
node_before->m_pNext = listhead+k;
(listhead+k)->m_nKey = node_data_temp;
(listhead+k)->m_pNext = NULL;
}
else{
(listhead+k)->m_nKey = node_data_temp;
(listhead+k)->m_pNext = node_next;
node_before->m_pNext = listhead+k;
}
break;
}
node_before = node_next;
node_next = node_next->m_pNext;
}
}
}
scanf("%d", &del_node_data); //输入要删除的元素
for(node_next=listhead; node_next!=NULL; node_before=node_next,node_next=node_next->m_pNext){
if(node_next->m_nKey == del_node_data){
if(node_next==listhead){
listhead = node_next->m_pNext;
}
else{
node_before->m_pNext = node_next->m_pNext;
}
break;
}
}
//显示单向链表结果
for(node_next=listhead; node_next!=NULL; node_next=node_next->m_pNext){
printf("%d", node_next->m_nKey);
if(node_next->m_pNext!=NULL)
printf(" ");
}
system("pause");
return 0;
}
<p>
</p>