链表去重c语言,企业链表C语言实现 - osc_ehnjp0jy的个人空间 - OSCHINA - 中文开源技术交流社区...

这篇博客介绍了如何使用C++实现一个企业级链表数据结构,包括初始化、插入、删除、查找、打印和释放链表等操作。示例中展示了如何定义链表节点结构体、链表结构体,并提供了相应的函数指针类型用于自定义打印和比较节点。此外,还给出了一个实际应用例子,展示了如何插入和打印包含人员信息的链表节点,并进行查找操作。

/*

* LinkList.h

*

* Created on: 2019年7月20日

* Author: Administrator

*/

#ifndef SRC_LINKLIST_H_

#define SRC_LINKLIST_H_

#include

#include

/**

* 企业链表的实现

*/

//链表小结点 和普通链表相比较 没有数据域

typedef struct LINKNODE {

struct LINKNODE *next;

} LinkNode;

//链表结构体

typedef struct LINKLIST {

LinkNode head; // 和普通链表的区别, 不是linkNode指针,而是一个 LinkNode 结构体

int size;

}LinkList;

//打印函数指针

typedef void(*PRINTLINKNODE)(LinkNode *);

//比较的函数指针

typedef int(*COMPARENODE)(LinkNode *, LinkNode *);

//初始化链表

LinkList * Init_LinkList();

//在指定位置插入

void Insert_LinkList(LinkList *list, int pos, LinkNode *data);

//删除指定位置的值

void RemoveByPos_LinkList(LinkList *list, int pos);

//获得链表的长度

int Size_LinkList(LinkList *list);

//查找

int Find_LinkList(LinkList *list, LinkNode* data, COMPARENODE compare);

//打印链表节点

void Print_LinkList(LinkList *list, PRINTLINKNODE print);

// 返回第一个节点

LinkNode *Front_LinkList(LinkList *list);

// 释放链表

void FreeSpace_LinkList(LinkList *list);

#endif /* SRC_LINKLIST_H_ */

/*

* LinkList.c

*

* Created on: 2019年7月20日

* Author: Administrator

*/

#include "LinkList.h"

//初始化链表

LinkList * Init_LinkList() {

LinkList *list = (LinkList *)malloc(sizeof(LinkList));

list->head.next = NULL;

list->size = 0;

return list;

}

//在指定位置插入

void Insert_LinkList(LinkList *list, int pos, LinkNode *data) {

if(list == NULL){

return;

}

if(pos < 0 || pos > list->size){

pos = list->size;

}

//查找插入位置

LinkNode *pCurrent = &(list->head);

for(int i = 0; i< pos; i++){

pCurrent = pCurrent->next;

}

//插入新节点

data->next = pCurrent->next;

pCurrent->next = data;

list->size++;

}

//删除指定位置的值

void RemoveByPos_LinkList(LinkList *list, int pos) {

if(list == NULL){

return;

}

if(pos < 0 || pos >= list->size){

pos = list->size;

}

//辅助指针变量

LinkNode *pCurrent = &(list->head);

while(pCurrent != NULL){

pCurrent = pCurrent->next;

}

//删除节点

pCurrent->next = pCurrent->next->next;

list->size--;

}

//获得链表的长度

int Size_LinkList(LinkList *list) {

return list->size;

}

//查找

int Find_LinkList(LinkList *list, LinkNode* data, COMPARENODE compare) {

if(list == NULL) {

return -1;

}

if(data == NULL){

return -1;

}

//辅助指针变量

LinkNode *pCurrent = list->head.next;

int index = 0;

int flag = -1;

while(pCurrent != NULL){

if(compare(pCurrent, data) == 0){

flag = index;

break;

}

index++;

pCurrent = pCurrent->next;

}

return flag;

}

//打印链表节点

void Print_LinkList(LinkList *list, PRINTLINKNODE print) {

if(list == NULL){

return;

}

//辅助指针 list->head.next 指向第一个有效值

LinkNode *pCurrent = list->head.next;

while(pCurrent != NULL){

print(pCurrent);

pCurrent = pCurrent->next;

}

}

// 返回第一个节点

LinkNode *Front_LinkList(LinkList *list) {

return (LinkNode *)&list->head;

}

// 释放链表

void FreeSpace_LinkList(LinkList *list) {

if(list == NULL){

return;

}

free(list);

}

#include "LinkList.h"

#include

#include

#include

typedef struct PERSON {

LinkNode *next;

char name[64];

int age;

} Person;

//打印函数指针

void MyPrint(LinkNode *data) {

Person *p = (Person *)data;

printf("Name %s, Age %d .\n", p->name, p->age);

}

//比较函数指针

int MyCompare(LinkNode * node1, LinkNode *node2) {

Person *p1 = (Person *)node1;

Person *p2 = (Person *)node2;

if(strcmp(p1->name, p2->name) && p1->age == p2->age) {

return 0;

}

return -1;

}

int main(){

printf("企业链表 \n");

//创建链表

LinkList *list = Init_LinkList();

//创建数据

Person p1,p2,p3,p4,p5;

strcpy(p1.name, "jarvis1");

strcpy(p2.name, "jarvis2");

strcpy(p3.name, "jarvis3");

strcpy(p4.name, "jarvis4");

strcpy(p5.name, "jarvis5");

p1.age = 11;

p2.age = 12;

p3.age = 13;

p4.age = 14;

p5.age = 15;

//将结点加入链表

Insert_LinkList(list, 0, (LinkNode *)&p1);

Insert_LinkList(list, 0, (LinkNode *)&p2);

Insert_LinkList(list, 0, (LinkNode *)&p3);

Insert_LinkList(list, 0, (LinkNode *)&p4);

Insert_LinkList(list, 0, (LinkNode *)&p5);

//打印

printf("----------\n");

Print_LinkList(list, MyPrint);

//查找

Person *findP;

strcpy(findP->name, "Jarvis1");

findP->age = 15;

int findFlag = Find_LinkList(list, findP, MyCompare);

printf("findFlag %d \n",findFlag);

//删除链表

printf("删除链表----------\n");

printf("----------\n");

system("pause");

//删除链表

FreeSpace_LinkList(list);

return 0;

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值