单项链表-企业级版本

一初始化链表

二.插入链表

三.遍历链表

四.删除链表

1.按位删除

2.按值删除

五销毁链表

enterprise_linkList.h

#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

strucrt LinkNode
{
//只维护指针域
struct LinkNode * next;
};
struct LList
{
struct LinkNode pHeader;//链表头节点
int m_Size;//链表长度
};
typedef void *LinkList;
 //初始化链表
void LinkList init_LinkList()
//插入链表
void insert_LinkList(LinkList list,int pos,void*data);
//遍历链表
void foreach_LinkList(LinkList list,void(*myForeach)(void*));
 //删除链表-按位删除
void removeByPos_LinkList(LinkList list,int pos);
 //删除链表-按值删除
void removeByValue_LinkList(LinkList list, void *data,int (*myCompare)(void* ,void*));
 //销毁链表
void destroy_LinkList(LinkList list);

tset()

#include"enterprise_linkList.h"
//测试
struct Person
{
void *aaaa//struct LinkNode node;//预定好的钱4个字节给底层链表使用
char name;
int age;
}
int myCompare(void *data1,void*data2)
{
struct Preson*p1 =data1;
struct Preson*p2 =data2;
return strcmp(p1->name,p2->name)=0 && p1->age=p2->age;
}
void printPerson(void*data)
{
struct Person*p =data;
printf("姓名: %s  年龄: %d\n",p->name,p->age);
}

tset01()
{
//初始化链表
LinkList mylist= int_ListList();
//准备数据
struct Person p1 ={NULL,"aaa",10};
struct Person p2 ={NULL,"bbb",20};
struct Person p3 ={NULL,"ccc",30};
struct Person p4 ={NULL,"ddd",40};
struct Person p5 ={NULL,"eee",50};

insert_LinkList(mylist,0,&p1);
insert_LinkList(mylist,0,&p2);
insert_LinkList(mylist,0,&p3);
insert_LinkList(mylist,1,&p4);
insert_LinkList(mylist,100,&p5);
//ccc ddd bbb aaa eee

//遍历链表
foreach_mylist(list,printPerson);

//测试按位删除
removeByPos_LinkList(mylist,2);
foreach_mylist(list,printPerson);

//测试按值删除
//struct Person p={"aaa",10};
//removeByValue——LinkList(mylist,&p,myCompare);

//测试销毁
destroy_LinkList(mylist);
}

int main ()
{
system("pause");
return EXIT_SUCCESS;
}

enterprise_linkList.c

#include"enterprise_linkList.h"
                                    //初始化链表
void LinkList init_LinkList()
{
struct LList*myList=malloc(sizeof(struct LList));
if(NULL == myList)
{
return NULL;
}
myList->pHeader.next  =NULL;
myList->m_Size=0;
return myList;
}
                                    //插入链表
void insert_LinkList(LinkList list,int pos,void*data)
{
if(NULL==list)
{
return ;
}
if(NULL== data)
{
return;
}
struct LList*mylist=list
if(pos<0 || pos>mylist->m_Size-1)
{
//无效位置 进行尾插
pos= mylist->m_Size;
}
//将用户的数据 前4个字节转为 LinkNode类型
struct LinkNode *myNode=data;
//找到插入数据的前驱节点位置
structLinkNode* pCurrent = &mylist->pHeader;
for(int i=0;i<pos;i++)
{
pCurrent=pCurrent->next;
}
//更改指针的指向
myNode->next=pCurrent->next;
pCurrent->next=myNode;
//更新链表长度
mylist->m_Size++;
}
                                      //遍历链表

void foreach_LinkList(LinkList list,void(*myForeach)(void*))
{
if(NULL == list)
{
return ;
}
struct LinkNode *node=myList->pHeader.next;//第一个有数据的节点
for(int i=0;i<mylist->m_Size;i++)
{
myForeach(node);
node=node->next;
}
}
                                //删除链表-按位删除
void removeByPos_LinkList(LinkList list,int pos)
{
if(NULL == list)
{
return;
}
struct LList myList=list;
if(pos<0 || pos>myList->m_Size-1)
{
无效位置 进行尾插
pos=myList->m_Size;
}
//找到要删除位置的前驱节点
struct LinkNode*pCurrent =&myList->pHeader;
for(int i=0;i<pos;i++)
{
pCurrent=pCurrent->next;
}
//记录待删除的节点
struct LinkNode*pDel=pCurrent->next;
//更改指针指向
pCurrent->next=pDel->next;  
//free(pDel);//我们的链表中是不维护数据域的,写了free反而会出错
//更新链表的长度
myList->m_Size--;
}
                             //删除链表-按值删除

void removeByValue_LinkList(LinkList list, void *data,int (*myCompare)(void* ,void*))
{
if(NULL==list)
{
return;
}
if(NULL == data)
{
return;
}
struct LList*myList=list;
struct LinkNode *pPrev=&myList->pHeader;
struct LinkNode pCurrent=pPrev->next;
for(int i=0;i<myList->m_Size; i++)
{
//if(pCurrent->data=data)//交给用户进行对比
if(myCompare(pCurrent->data,data))
{
//更改指针指向
pPrev->next=pCurrent->next;
//释放掉要删除的节点
free(pCurrent);
pCurrent=NULL;
//更新链表长度
myList->m_Size--;
}
pPrev=pCurrent;
pCurrent=pCurrent->next;
}
                            //销毁链表
void destroy_LinkList(LinkList list)
{
if(NULL == list)
{
return ;
}
clear_LinkList(list);
free(list);
list=NULL;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值