zoukankan      html  css  js  c++  java
  • C语言的链表-第二部分

    无空头

    #include"stdio.h"
    #include"stdlib.h"
    #include"windows.h"
    
    
    /*链表的基本使用,不用改,直接用欢迎交流 QQ2473183730*/
    
    struct Node
    {
    	int a;
    	struct Node* pNEXT;
    };
    
    //链表头尾指针
    struct Node* g_pHead = NULL;
    struct Node* g_pEnd = NULL;
    
    struct Node* Create_Node(int N)
    {
    	struct Node* pTemp = (struct Node*)malloc(sizeof(struct  Node));
    	pTemp->a = N;
    	pTemp->pNEXT = NULL;
    	return pTemp;
    }
    
    
     //////////添加数据函数  尾添加的方式
    void AddNodeToList_End(int N)
    {
    	//创建一个节点
    	struct Node* pTemp =Create_Node(N);
    
    	//链接
    	if (g_pHead == NULL)
    	{
    		g_pHead = pTemp;
    		g_pEnd = pTemp;//此时首尾指针相同
    	}
    	else
    	{
    		g_pEnd->pNEXT = pTemp;//新的节点指向上一个节点的Next
    		g_pEnd = pTemp;;//尾巴一直指向最后一个节点
    	}
    }
    
    
    //////////添加数据函数  头添加的方式
    void AddNodeToList_Head(int N)
    {
    	//创建一个节点
    	struct Node* pTemp=Create_Node(N);
    
    
    	//链接
    	if (g_pHead == NULL)
    			{
    				g_pHead = pTemp;
    				g_pEnd = pTemp;				//此时首尾指针相同
    			}
    	else
    	{
    		pTemp->pNEXT =g_pHead ;				//新的节点指向原来节点的Next
    		g_pHead = pTemp;;					//头部一直指向最后一个节点
    	}
    }
    
    
    
    //链表的遍历,全部输出
    void List_SeeAll(struct Node* TouPlace)
    {
    	struct Node* CANSHU = TouPlace;
    	if (CANSHU == NULL)
    	{
    		printf("当前链表为空");
    		exit(0);
    	}
    	else
    	{
    		while (CANSHU!=NULL)
    		{
    			printf("%d
    ", CANSHU->a);
    			CANSHU = CANSHU->pNEXT;
    		}
    	}
    }
    
    
    //查找数据
    struct Node* List_Search(struct Node* TouPlace,int se)
    {
    	struct Node* CANSHU = TouPlace;
    	if (CANSHU == NULL)
    	{
    		exit(0);
    		printf("当前链表为空
    ");
    	}
    	else
    	{
    		while (CANSHU != NULL)
    		{
    			if (CANSHU->a == se)
    			{
    				return CANSHU;				//返回节点       
    			}
    			CANSHU = CANSHU->pNEXT;
    		}
    	}
    	return NULL;							//没找到,返回NULL
    }
    
    
    
    //清空链表
    void List_Free_All(struct Node* TouPlace)// TouPlace应为g_pHead
    {
    	struct Node* CANSHU = TouPlace;
    	while (CANSHU != NULL)
    	{
    		struct Node* pt = CANSHU;			//构建中间参数
    		CANSHU = CANSHU->pNEXT;				//先指向下一个,再释放
    		free(pt);							//释放内存
    	}
    	//清空链表头尾指针
    	g_pHead = NULL;
    	g_pEnd = NULL;
    }
    
    //指定特定(位置)内容的后一位插入节点
    void Add_List_Behind_Special(struct Node* TouPlace,int index, int N)
    {
    	if (TouPlace == NULL)
    	{
    		printf("此链表为空
    ");
    		return;
    	}
    	else 
    	{
    		struct Node* pt = List_Search(TouPlace, index);
    		if (pt == NULL)
    		{
    			printf("没有指定节点
    ");
    			return;
    		}
    		else
    		{
    			struct Node* pTemp =Create_Node(N);
    
    			if (pt == g_pEnd)
    			{
    				g_pEnd->pNEXT = pTemp;
    				g_pEnd = pt;
    			}
    			else
    			{
    				//先连
    				pTemp->pNEXT = pt->pNEXT;
    				//后断 
    				pt->pNEXT = pTemp;
    			}
    		}
    	}
    }
    
    
    //指定特定(位置)内容的前一位插入节点
    void Add_List_Front_Special(struct Node* TouPlace,int index, int N)
    {
    	if (TouPlace == NULL)
    	{
    		printf("此链表为空
    ");
    		return;
    	}
    	else
    	{
    		struct Node* pt = List_Search(TouPlace, (index-1));
    		if (pt == NULL)
    		{
    			printf("没有指定节点
    ");
    			return;
    		}
    		else
    		{
    			struct Node* pTemp = (struct Node*)malloc(sizeof(struct  Node));
    			pTemp->a = N;
    			pTemp->pNEXT = NULL;
    
    			//先连
    			pTemp->pNEXT = pt->pNEXT;
    			//后断 
    			pt->pNEXT = pTemp;
    		}
    	}
    }
    
    
    //头删除 删除第一个节点
    void Delete_List_Head(struct Node* TouPlace) // TouPlace应为g_pHead
    {
    	if (NULL == TouPlace)
    	{
    		printf("当前的链表为空
    ");
    		return;
    	}
    	else
    	{
    		g_pHead = TouPlace->pNEXT;
    		free(TouPlace);
    	}
    }
    
    
    
    
    // 尾删除
    void Delete_List_End(struct Node* TouPlace, struct Node* WeiPlace)//TouPlace应为g_pHead,WiePlace 是g_pEnd
    {
    	if (NULL == TouPlace)
    	{
    		printf("当前的链表为空
    ");
    		return;
    	}
    	else
    	{
    
    		if (TouPlace == WeiPlace)//只有一个
    		{
    			free(g_pHead);
    			g_pHead = NULL;
    			g_pEnd = NULL;
    		}
    		else
    		{
    			//找到倒数第二个
    			struct Node* pTemp = g_pHead;
    			while (pTemp->pNEXT != g_pEnd)
    			{
    				pTemp = pTemp->pNEXT;
    			}
    
    			//删除 
    			free(g_pEnd);
    			g_pEnd = pTemp; 
    			g_pEnd->pNEXT = NULL;
    		}
    	}
    }
    
    //删除任意节点
    void Delete_List_Special(struct Node* TouPlace, struct Node* weiPlace, int index)//TouPlace应为g_pHead,WiePlace 是g_pEnd
    {
    	if (NULL == TouPlace)
    	{
    		printf("当前的链表为空
    ");
    		return;
    	}
    	else
    	{
    		struct Node* pTemp = List_Search(g_pHead, index);
    		if (pTemp==NULL)
    		{
    			printf("查无此节点");
    			return;
    		}
    		else
    		{
    			//只有一个节点
    			if (TouPlace == weiPlace)
    			{
    				free(g_pHead);
    				g_pHead = NULL;
    				g_pEnd = NULL;
    
    			}
    			//有两个节点
    			else if (TouPlace->pNEXT == weiPlace)
    			{
    				if (pTemp == g_pHead)
    				{
    					Delete_List_Head(g_pHead);
    				}
    				else
    				{
    					Delete_List_End(g_pHead, g_pEnd);
    				}
    			}
    
    			//有多个节点
    			else
    			{
    				if (pTemp == g_pHead)
    				{
    					Delete_List_Head(g_pHead);
    				}
    				else if(pTemp == g_pEnd)
    				{
    					Delete_List_Head(g_pHead);
    					 
    				}
    				else
    				{
    				//找到被删除节点的前一个
    					struct Node* pT = g_pHead;
    					while (pT->pNEXT != pTemp)
    					{
    						pT = pT->pNEXT;
    					}
    					//链接
    					pT->pNEXT = pTemp->pNEXT;
    					//删除
    					free(pTemp);
    				}
    			}
    		}
    	}
    }
    
    //特定位置的替换
    void Delete_Remap_Special(struct Node* TouPlace, int se, int Aim)
    {
    	struct Node* UI = List_Search(TouPlace, se);
    	if (UI == NULL)
    	{
    		printf("查找失败");
    	}
    	else
    	{ 
    	UI->a = Aim;
        }
    }
    
    int main(void)
    {
    	AddNodeToList_Head(7);
    	AddNodeToList_Head(6);
    	AddNodeToList_Head(5);
    	AddNodeToList_Head(4);
    	AddNodeToList_Head(3);
    	AddNodeToList_Head(2);
    	AddNodeToList_Head(1);
    	
    
    	Delete_List_Special(g_pHead,g_pEnd,5);
    	List_SeeAll(g_pHead);
    	
    	system("pause");
    	return 0;
    }
    

      

  • 相关阅读:
    C#实现注册码
    多表链接 Left join
    Repeater 一行显示两列数据
    Repeater一行显示数据库中多行表记录
    HP QC(Quality Center)在Windows 7 IE8 IE9下不能工作解决方案
    Android应用换肤总结
    Lua 第一个应用程序 Hello World
    JNI 技术与 Android 应用
    NSAutoreleasePool' is unavailable: not avail
    1-2基础控件
  • 原文地址:https://www.cnblogs.com/Loving-Q/p/12629649.html
Copyright © 2011-2022 走看看