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"LinkList.h"
    #include<stdlib.h>
    #include<stdio.h>
    //链表初始化:创建链表
    LinkList* Creat_LinkList()
    {
    	LinkList *list=NULL;
    	LinkNode* header=NULL;
    	list=(LinkList*)malloc(sizeof(LinkList));
    	if(list==NULL)
    	{
    		return NULL;
    	}
    	header=(LinkNode*)malloc(sizeof(LinkNode));
    	if(header==NULL)
    	{
    		free(list);
    		list=NULL;
    		return NULL;
    	}
    	header->next=NULL;
    	header->data=0;//该数据没意义
    	list->head=header;
    	list->length=0;
    	return list;
    }
    //插入数据
    void Insert_LinkList(LinkList* list,int pos,void* data)
    {
    	LinkNode *pCurrent=NULL;//辅助指针
    	LinkNode *newnode=NULL;//插入的新节点
    	int i=0;
    	if(list==NULL)
    	{
    		return ;
    	}
    	if(pos<0)
    	{
    		return ;
    	}
    	if(pos>list->length)
    	{
    		pos=list->length;
    	}
    	pCurrent=list->head;
    	for(i=0;i<pos;i++)
    	{
    		pCurrent=pCurrent->next;
    	}
    	//创建新的节点
    	newnode=(LinkNode*)malloc(sizeof(LinkNode));
    	newnode->data=data;
    	newnode->next=NULL;
    	//新节点插入链表中
    	newnode->next=pCurrent->next;
    	pCurrent->next=newnode;
    	//更新链表的长度
    	list->length++;
    }
    //根据位置删除
    void Remove_LinkList(LinkList* list,int pos)
    {
    	int i=0;
    	LinkNode *pCurrent=NULL;//辅助指针
    	LinkNode* pDel=NULL;//缓存要删除的节点
    	if(list==NULL)
    	{
    		return ;
    	}
    	if(pos<0||pos>list->length-1)
    	{
    		return ;
    	}
    	//查找要删除节点的位置
    	pCurrent=list->head;
    	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,void* data)
    {
    	LinkNode* pPrev=NULL;//两个辅助指针变量
    	LinkNode* pCurrent=NULL;
    	int flag=0;
    	if(list==NULL||data==NULL)
    	{
    		return;
    	}
    	//辅助指针变量
    	pPrev=list->head;
    	pCurrent=pPrev->next;
    	//查找节点:两个辅助指针同时移动
    	while(list->length>0)
    	{
    		if(pCurrent->data==data)//找到了
    		{
    			pPrev->next=pCurrent->next;
    			list->length--;
    			free(pCurrent);
    			break;
    		}
    		pPrev=pCurrent;
    		pCurrent=pPrev->next;
    		if(pCurrent==NULL)//没找到
    		{
    			break ;
    		}
    	}
    	return ;
    }
    //获得链表长度
    int Length_LinkList(LinkList* list)
    {
    	if(list==NULL)
    	{
    		return -1;
    	}
    	return list->length;
    }
    //获得指定位置的数据
    void* GetData_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->head;
    	for(i=0;i<pos;i++)
    	{
    		pCurrent=pCurrent->next;
    	}
    	return pCurrent->next->data;
    }
    //获取指定数据的位置
    int GetPos_LinkList(LinkList* list,void* data)
    {
    	int pos=0;
    	LinkNode *pCurrent=NULL;//辅助指针
    	if(list==NULL||data==NULL)
    	{
    		return -1;
    	}
    	pCurrent=list->head->next;
    	while(list->length>0)
    	{
    		if(pCurrent->data==data)//找到了
    		{
    			return pos;
    		}
    		pCurrent=pCurrent->next;
    		if(pCurrent==NULL)//没找到
    		{
    			return -1;
    		}
    		pos++;
    	}
    	return -1;
    }
    //根据位置修改值
    void Modify_LinkList(LinkList* list,int pos,void* data)
    {
    	int i=0;
    	LinkNode* pCurrent=NULL;//赋值指针
    	LinkNode* pPrev=NULL;
    	LinkNode* newnode=NULL;
    	if(list==NULL||data==NULL)
    	{
    		return ;
    	}
    	if(pos<0||pos>list->length-1)
    	{
    		return ;
    	}
    	//查找要修改的节点:两个辅助指针同时移动
    	pPrev=list->head;
    	pCurrent=pPrev->next;
    	for(i=0;i<pos;i++)
    	{
    		pPrev=pCurrent;
    		pCurrent=pCurrent->next;
    	}
    	//创建新的节点
    	newnode=(LinkNode*)malloc(sizeof(LinkNode));
    	newnode->data=data;
    	newnode->next=NULL;
    	//新节点插入链表中
    	newnode->next=pCurrent->next;
    	pPrev->next=newnode;
    	//释放旧的节点
    	free(pCurrent);
    	return ;
    }
    //根据值修改值
    void Change_LinkList(LinkList* list,void* olddata,void* newdata)
    {
    	LinkNode* pPrev=NULL;
    	LinkNode* pCurrent=NULL;
    	LinkNode* newnode=NULL;
    	if(list==NULL || olddata==NULL || newdata==NULL)
    	{
    		return;
    	}
    	//辅助指针
    	pPrev=list->head;
    	pCurrent=pPrev->next;
    	while(list->length>0)
    	{
    		if(pCurrent->data==olddata)//找到了
    		{
    			newnode=(LinkNode*)malloc(sizeof(LinkNode));
    			newnode->data=newdata;
    			newnode->next=NULL;
    			//修改newnode的next指针指向
    			newnode->next=pCurrent->next;
    			pPrev->next=newnode;
    			free(pCurrent);
    			break;
    		}
    		pPrev=pCurrent;
    		pCurrent=pPrev->next;
    		if(pCurrent==NULL)//没有找到
    		{
    			break;
    		}
    	}
    }
    //清空链表
    void Clear_LinkList(LinkList* list)
    {
    	LinkNode *pCurrent=NULL;//辅助指针
    	if(list==NULL)
    	{
    		return ;
    	}
    	pCurrent=list->head->next;
    	while(pCurrent!= NULL)
    	{
    		//缓存下一个结点位置
    		LinkNode* pNext=pCurrent->next;
    		free(pCurrent);
    		pCurrent=pNext;
    	}
    	//改变头结点指向
    	list->head->next=NULL;
    	list->length = 0;
    }
    //销毁链表
    void Destroy_LinkList(LinkList* list)
    {
    	if(list==NULL)
    	{
    		return;
    	}
    	Clear_LinkList(list);//清空链表
    	if (list->head!=NULL)
    	{
    		free(list->head);
    	}
    	//释放链表内存
    	free(list);
    }
    //打印函数
    void Print_LinkList(LinkList* list, PRINTLINKNODE print)
    {
    	LinkNode* pCurrent=NULL;
    	if(list==NULL)
    	{
    		return;
    	}
    	if(print==NULL)
    	{
    		return;
    	}
    	pCurrent=list->head->next;
    	while(pCurrent!=NULL)
    	{
    		print(pCurrent->data);
    		pCurrent=pCurrent->next;
    	}
    	printf("
    ");
    }
    

      test.c文件 为了测试这个单链表

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include"LinkList.h"
    //自定义数据
    typedef struct _Player
    {
    	char name[128];
    	int age;
    	double salary;
    }Player;
    
    //打印回调
    void PrintPlayer(void* data)
    {
    	Player* p=NULL;
    	if(data==NULL)
    	{
    		return ;
    	}
    	p=(Player*)data;
    	printf("Name:%s Age:%d Salary:%f
    ",p->name,p->age,p->salary);
    }
    int main()
    {
    
    	//初始化创建一个链表
    	int pos=0;
    	Player *p=NULL;
    	LinkList *list=Creat_LinkList();
    	//创建数据
    	Player p1={"aaa",10,1};
    	Player p2={"bbb",20,2};
    	Player p3={"ccc",30,3};
    	Player p4={"ddd",40,4};
    	Player p0={"000",00,0};
    	//插入数据
    	Insert_LinkList(list,0,&p1);
    	Insert_LinkList(list,0,&p2);
    	Insert_LinkList(list,0,&p3);
    	Insert_LinkList(list,0,&p4);
    	//打印
    	Print_LinkList(list,PrintPlayer);
    	//测试删除
    	//Remove_LinkList(list,3);
    	//Delete_LinkList(list,&p2);
    	//Modify_LinkList(list,3,&p0);
    	Change_LinkList(list,&p3,&p0);
    	Print_LinkList(list,PrintPlayer);//打印
    	//pos=GetPos_LinkList(list,&p);
    	printf("pos=%d
    ",pos);
    	//销毁
    	Destroy_LinkList(list);
    	return 0;
    
    }
    

      

  • 相关阅读:
    PHP 输出图像
    js 获取元素
    js 获取 坐标
    【javascript】ajax 基础 --本文转载
    JS获取当前时间
    如何安装win10和linux 双系统
    自动验证是ThinkPHP
    thinkphp 动态验证码 ------控制器传输到html 数据时间转换处理
    thinkphp 验证
    软件测试-测试开发需要学习的知识结构
  • 原文地址:https://www.cnblogs.com/jueshi0208/p/5549081.html
Copyright © 2011-2022 走看看