zoukankan      html  css  js  c++  java
  • 企业版单链表

    LinkList.h文件

    #ifndef LINKLIST_H
    #define LINKLIST_H
    //有头单链表
    //链表结点
    typedef struct _LinkNode
    {
    	struct _LinkNode* next;
    }LinkNode;
    
    //链表结构体
    typedef struct _LinkList
    {
    	LinkNode header;
    	int length;
    }LinkList;
    
    //回调打印
    typedef void(*PRINTNODE)(LinkNode*);
    
    //初始化链表
    LinkList* Creat_LinkList();
    //插入操作
    void Insert_LinkList(LinkList* list,int pos,LinkNode* data);
    //根据位置删除
    void Remove_LinkList(LinkList* list,int pos);
    //根据数据删除
    void Delete_LinkList(LinkList* list,LinkNode* data);
    //根据值返回位置
    int GetPos_LinkList(LinkList* list,LinkNode* data);
    //根据位置返回节点值
    LinkNode* GetNode_LinkList(LinkList* list,int pos);
    //根据位置修改值
    void Modify_LinkList(LinkList* list,int pos,LinkNode* newdata);
    //根据值修改值
    void Change_LinkList(LinkList* list,LinkNode* olddata,LinkNode* newdata);
    //清空链表
    void Clear_LinkList(LinkList* list);
    //销毁链表
    void Destroy_LinkList(LinkList* list);
    //打印链表
    void Print_LinkList(LinkList* list,PRINTNODE print);
    
    #endif
    

      LinkList.c文件

    #include<stdlib.h>
    #include<stdio.h>
    #include"LinkList.h"
    
    //初始化链表:创建单链表
    LinkList* Creat_LinkList()
    {
    
    	//给链表的结构体分配内存
    	LinkList* list=(LinkList*)malloc(sizeof(LinkList));
    	if (list==NULL)
    	{
    		return NULL;
    	}
    	list->header.next = NULL;
    	list->length = 0;
    	return list;
    }
    //插入操作
    void Insert_LinkList(LinkList* list,int pos,LinkNode* data)
    {
    	int i=0;
    	LinkNode* pCurrent=NULL;//辅助指针
    	if(list==NULL)
    	{
    		return;
    	}
    	if (pos < 0)
    	{
    		return;
    	}
    	if(pos>list->length)
    	{
    		pos=list->length;
    	}
    	if(data==NULL)
    	{
    		return;
    	}
    
    	//找位置
    	pCurrent=&(list->header);
    	for(i=0;i<pos;i++)
    	{
    		pCurrent=pCurrent->next;
    	}
    
    	//结点入链表
    	data->next=pCurrent->next;
    	pCurrent->next=data;
    	list->length++;
    }
    //根据位置删除
    void Remove_LinkList(LinkList* list,int pos)
    {
    	LinkNode* pCurrent=NULL;
    	LinkNode* pDel=NULL;//缓存要删除的节点
    	int i=0;
    	if(list==NULL)
    	{
    		return;
    	}
    	if(pos<0||pos>list->length-1)
    	{
    		return;
    	}
    	pCurrent=&(list->header);;
    	for(i=0;i<pos;i++)
    	{
    		pCurrent=pCurrent->next;
    	}
    	//缓存待删除结点
    	pDel=pCurrent->next;
    	pCurrent->next=pDel->next;
    	//不需要free(pDel) 
    	list->length--;
    }
    //根据数据删除
    void Delete_LinkList(LinkList* list,LinkNode* data)
    {
    	LinkNode* pCurrent=NULL;//辅助指针
    	LinkNode* pPrev=NULL;
    	if(list==NULL||data==NULL)
    	{
    		return ;
    	}
    	//查找要删除的节点:两个辅助指针同时移动
    	pPrev=&(list->header);
    	pCurrent=pPrev->next;
    	while(list->length>0)
    	{
    		if(pCurrent==data)//找到了
    		{
    			pPrev->next=pCurrent->next;
    			list->length--;
    			break;
    		}
    		pPrev=pCurrent;
    		pCurrent=pCurrent->next;
    		if(pCurrent==NULL)//没找到
    		{
    			break;
    		}
    	}
    }
    //根据值返回位置
    int GetPos_LinkList(LinkList* list,LinkNode* data)
    {
    	LinkNode* pCurrent=NULL;//辅助指针
    	int pos=0;
    	if(list==NULL||data==NULL)
    	{
    		return -1;
    	}
    	pCurrent=list->header.next;
    	while(list->length>0)
    	{
    		if(pCurrent==data)//找到了
    		{
    			return pos;
    		}
    		pCurrent=pCurrent->next;
    		if(pCurrent==NULL)//没找到
    		{
    			return -1;
    		}
    		pos++;
    	}
    	return -1;
    }
    //根据位置返回节点
    LinkNode* GetNode_LinkList(LinkList* list,int pos)
    {
    	int i=0;
    	LinkNode* pCurrent=NULL;//辅助指针
    	if(list==NULL)
    	{
    		return NULL;
    	}
    	if(pos<0||pos>list->length-1)
    	{
    		return NULL;
    	}
    	pCurrent=&(list->header);
    	for(i=0;i<pos;i++)
    	{
    		pCurrent=pCurrent->next;
    	}
    	return pCurrent->next;
    }
    //根据位置修改值
    void Modify_LinkList(LinkList* list,int pos,LinkNode* newdata)
    {
    	int i=0;
    	LinkNode* pCurrent=NULL;//两个辅助指针
    	LinkNode* pPrev=NULL;
    	if(list==NULL||newdata==NULL)
    	{
    		return ;
    	}
    	if(pos<0||pos>list->length-1)
    	{
    		return ;
    	}
    	//找到要修改的值:两个辅助指针同时移动
    	pPrev=&(list->header);
    	pCurrent=pPrev->next;
    	for(i=0;i<pos;i++)
    	{
    		pPrev=pCurrent;
    		pCurrent=pCurrent->next;
    	}
    	newdata->next=pCurrent->next;
    	pPrev->next=newdata;
    	return ;
    }
    //根据值修改
    void Change_LinkList(LinkList* list,LinkNode* olddata,LinkNode* newdata)
    {
    	LinkNode* pCurrent=NULL;//辅助指针
    	LinkNode* pPrev=NULL;
    	if(list==NULL||olddata==NULL||newdata==NULL)
    	{
    		return ;
    	}
    	//查找要求修改的值:两个辅助指针移动
    	pPrev=&(list->header);
    	pCurrent=pPrev->next;
    	while(list->length>0)
    	{
    		if(pCurrent==olddata)//找到了
    		{
    			newdata->next=pCurrent->next;
    			pPrev->next=newdata;
    			break;
    		}
    		pPrev=pCurrent;
    		pCurrent=pCurrent->next;
    		if(pCurrent==NULL)//没找到
    		{
    			break;
    		}
    	}
    }
    //清空链表
    void Clear_LinkList(LinkList* list)
    {
    	if(list==NULL)
    	{
    		return;
    	}
    	list->header.next=NULL;
    	list->length=0;
    }
    //销毁链表
    void Destroy_LinkList(LinkList* list)
    {
    	if(list==NULL)
    	{
    		return;
    	}
    	list->header.next=NULL;
    	list->length=0;
    	free(list);
    }
    //打印链表
    void Print_LinkList(LinkList* list,PRINTNODE print)
    {
    	LinkNode* pCurrent=NULL;
    	if(list==NULL)
    	{
    		return;
    	}
    
    	//辅助指针变量
    	pCurrent=list->header.next;
    	while(pCurrent!=NULL)
    	{
    		print(pCurrent);
    		pCurrent=pCurrent->next;
    	}
    	printf("
    ");
    }
    

      test.c文件,测试单链表

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include"LinkList.h"
    
    //自定义数据
    typedef struct _Player
    {
    	LinkNode node;//包含该节点
    	int age;
    	int number;
    }Player;
    
    //打印回调
    void PrintPlayer(LinkNode* node)
    {
    	Player* p=NULL;
    	if(node==NULL)
    	{
    		return ;
    	}
    	p=(Player*)node;
    	printf("Age:%d Number:%d
    ",p->age,p->number);
    }
    
    int main()
    {
    
    	//创建链表
    	int pos=0;
    	LinkList* list=Creat_LinkList();
    	//创建数据
    	Player p1,p2,p3,p0;
    	Player *p=NULL;
    	p0.age=0;
    	p0.number=0;
    	p1.age=10;
    	p1.number=1;
    
    	p2.age=20;
    	p2.number=2;
    
    	p3.age=30;
    	p3.number=3;
    
    	//插入数据
    	Insert_LinkList(list,0,(LinkNode*)&p1);
    	Insert_LinkList(list,0,(LinkNode*)&p2);
    	Insert_LinkList(list,0,(LinkNode*)&p3);
    	//打印
    	Print_LinkList(list,PrintPlayer);
    	//测试删除和修改
    	//Remove_LinkList(list,2);
    	Delete_LinkList(list,(LinkNode*)&p2);
    	//Modify_LinkList(list,3,(LinkNode*)&p0);
    	//Change_LinkList(list,(LinkNode*)&p1,(LinkNode*)&p0);
    	//打印
    	Print_LinkList(list,PrintPlayer);
    	pos=GetPos_LinkList(list,(LinkNode*)&p);
    	printf("pos=%d
    ",pos);
    	p=(Player*)GetNode_LinkList(list,2);
    	PrintPlayer((LinkNode*)p);
    	//销毁链表
    	Destroy_LinkList(list);
    	return 0;
    }
    

      

  • 相关阅读:
    2013,愿景
    多触式web前端开发之一:对于Touch的处理 [转]
    为什么我们常说很多时候一定要亲身经历了之后才能明白? [转]
    virtualenvwrapper 的安装和使用
    doccano在centos环境下安装,亲测可用
    pip install xxx i 清华镜像
    解决 ModuleNotFoundError: No module named 'pip'
    python3.5以后venv创建/激活/退出虚拟环境
    通过微调Transformers完成命名实体识别任务
    win10系统安装文本标注工具doccano
  • 原文地址:https://www.cnblogs.com/jueshi0208/p/5549092.html
Copyright © 2011-2022 走看看