单向链表插入与删除
题目要求:
//输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。
//链表结点定义如下:
//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>