单向链表.

一.初始化链表

二.插入链表

三.遍历链表

四.删除链表

1.按位删除

2.按值删除

五.返回链表长度

六.清空链表

七.销毁链表

linkList.h(头文件)

#pragma once
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
//链表节点
struct LinkNode
{
void * data;//数据域
struct LinkNode *next;//指针域
};
//链表结构体
struct LList
{
struct LinkNode pHeader;//头节点
int m_Size;//链接长度
}
typedef void * LinkList;
//初始化链表
Linklist  init_LinkList ()
 //插入节点
void insert_LinkList(LinkList list,intpos, void* data);
//遍历链表
void foreach_LinkList(LinkList list,void(*myPrint)(void*));
//删除节点-按位置进行删除
void removeByPos_LinkList(LinkList list,int pos);
//删除节点-按值进行删除
 void removeByValue_LinkList(LinkList list ,void*data,int(*myCompare)(void*,void*));
//清空链表
void clear_LinkList(LinkList list);
//返回链表长度
int size_LinkList(LinkList) ;
//销毁链表
void destroy_LinkList(LinkList list);

tset.c

#include"linkList.h"
struct Person 
{
char name[64];
int age;
};
void myPrintPerson(void * data)
{
struct Personn *p =data;
printf("姓名: %s 年龄: %d\n", p->name,p->age);
}
int  myCompare(void *data1,void*data2)
{
struct Person* p1 = data1;
struct Person* p2 = data2;

return strcmp(p1->name,p2->name)=0 && p1->age == p2-> age;
}
void tset()
{
//初始化链表
LinkList list = init_LinkList()
//插入数据
struct Person p1={"亚索",18};
struct Person p2={"瑞文",19};
struct Person p3={"鳄鱼",20};
struct Person p4={"诺手",21};
struct Person p5={"卡兹克",22};
struct Person p6={“狮子狗",23};

intsert_LinkList(list ,0,&p1);
intsert_LinkList(list ,1,&p2);
intsert_LinkList(list ,2,&p3);
intsert_LinkList(list ,3,&p4);
intsert_LinkList(list ,4,&p5);
intsert_LinkList(list ,100,&p6;)
// 亚索 瑞文 鳄鱼 诺手 卡兹克 狮子狗
printf("链表的长度为: %d\n",size_LinkList(list));
foreachLinkList(list,myPrintPerson);
//删除诺手
removeByPos_LinkList(list.3);
printf("链表的长度为: %d\n",size_LinkList(list));
foreachLinkList(list,myPrintPerson);
//删除瑞文
struct Person p={"瑞文",19};
removeByValue_LinkList(list,&p, myCompare)
printf("链表的长度为: %d\n",size_LinkList(list));
foreachLinkList(list,myPrintPerson);
//清空链表
clear_LinkList(list);
printf("链表的长度为: %d\n",size_LinkList(list));
foreachLinkList(list,myPrintPerson);
//销毁链表
destrot_LinkList(list);
}
int main()
{
tset()
system("pause")
return EXXIT_SUCCESS
}

linkList.c(源文件)

#include"linkList.h"

                                 //初始化链表
Linklist  init_LinkList ()
{
struct LList * myList = malloc(sizeof(struct LList));
if(NULL == myList)
{
re turn NULL;
}
                              
//初始化链表结构体
myList->pHeader.data =NULL;
myList _>pHeader.next =NULL;
return myList;
}
                                     //插入节点
void insert_LinkList(LinkList list,intpos, void* data)
{
if(NULL ==list)
{
return ;
}
if(NULL == data )
{
return ;
}
struct LList *myList = list;
if(pos<0 || pos>mylist->m_Size)
{
//无效位置 进行尾插
pos =myList_>m_Size;
}
//创建临时节点
struct LinkNode*pCurrent =&myLIst->pHeader;
for(int =0;i<pos;i++)
{
pCurrent=pCurrent->next; 
}
//通过循环 找到插入位置的前驱节点
//创建初新的节点
struct LinkNode * newNode = malloc(struct LinkNOde );
newNode->next=pCurrent->
pCurrent->next=newNode;
myList->m_Size++;
}
                                           //遍历链表
void foreach_LinkList(LinkList list,void(*myPrint)(void*))
{
if(NULL ==list)
{
return ;
}
struct LList * mylist= list
struct LinkNode *pCurrent =myList-> pHeader.next;//找到第一个有数据的节点
for(int i=0;i<myList->m_Size;i++)
{
myPrint(pCurrent->data);
pCurrent=pCurrent-> next;
}
}
                              //删除节点-按位置进行删除

void removeByPos_LinkList(LinkList list,int pos)
{
if(NULL == list )
{
return ;
}
struct LLinst*myList =list;
if( pos<0 ||pos>myList->m_Size-1)
{
return ;
}
//找到删除节点的前驱节点
 structLinkNode * pCurrent =&myList->pHeader
for(int i= 0; i<pos ;i++)
{
pCurrent =pCurrent->next;
}
//缓存中待删除的节点
struct LinkLNode *pDel=pCurrent->next;
//建立关系
pCurrent->next=pDel->next
//释放掉待删除的节点
free(Del);
Del=NULL;
//更新链表的长度
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__;
break;
}
pPrev=pCurrent;
pCurrent=pCurrent->next; 
}
}
                                        //清空链表
void clear_LinkList(LinkList list)
{
if (NULL == list )
{
return ;
}
struct LList *my_List=list;
struct LinkNode *pCurrent =my_List->pHeader.next;
for(int i=0;i<myList->m_Size;i++)
{
//先记住待删除节点的后继节点
struct LinkNode * pNext =pCurrent->next;
free(pCurrent);
pCurrent =pNext;
}
myList->pHeader.next =NULL;
myList->m_Size =0;
}
                                    //返回链表长度

int size_LinkList(LinkList) 
{
if(NULL == list)
{
return -1;
}
struct LList* myList =list;
return myList->m_Size;
}
                                   //销毁链表

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、付费专栏及课程。

余额充值