• 单向链表插入与删除


    题目要求:

    //输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。
    //链表结点定义如下:
    //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>
  • 相关阅读:
    Java实现 LeetCode 657 机器人能否返回原点(暴力大法)
    PHP imagearc
    PHP imageantialias
    PHP imagealphablending
    PHP imageaffinematrixget
    PHP imageaffinematrixconcat
    空单元 | empty-cells (Miscellaneous Level 2)
    矩阵 | matrix() (Transforms)
    相邻兄弟选择器 | Adjacent sibling selectors (Selectors)
    相抵路径 | offset-path (Motion Path)
  • 原文地址:https://www.cnblogs.com/xhyzjiji/p/6159390.html
Copyright © 2020-2023  润新知