zoukankan      html  css  js  c++  java
  • 企业链表C语言实现

    /*
     * LinkList.h
     *
     *  Created on: 2019年7月20日
     *      Author: Administrator
     */
    
    #ifndef SRC_LINKLIST_H_
    #define SRC_LINKLIST_H_
    
    #include<stdlib.h>
    #include<stdio.h>
    
    
    
    /**
     * 企业链表的实现
     */
    
    
    
    //链表小结点 和普通链表相比较 没有数据域
    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 <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    typedef struct PERSON {
    	LinkNode *next;
    	char name[64];
    	int age;
    } Person;
    
    //打印函数指针
    void MyPrint(LinkNode *data) {
    	Person *p = (Person *)data;
    	printf("Name %s, Age %d .
    ", 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("企业链表  
    ");
    
    	//创建链表
    	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("----------
    ");
    	Print_LinkList(list, MyPrint);
    
    	//查找
    	Person *findP;
    	strcpy(findP->name, "Jarvis1");
    	findP->age = 15;
    	int findFlag = Find_LinkList(list, findP, MyCompare);
    	printf("findFlag %d 
    ",findFlag);
    
    
    	//删除链表
    	printf("删除链表----------
    ");
    	printf("----------
    ");
    	system("pause");
    	//删除链表
    	FreeSpace_LinkList(list);
    	return 0;
    }
    
    
  • 相关阅读:
    VUe兄弟通信
    vue组件之间的通信, 父子组件通信,兄弟组件通信
    js 数组 map方法
    vue生命周期
    使用JQuery获取被选中的checkbox的value值
    C#中struct和class的区别详解 (转载)
    C# 增加时间的三个方法
    c# 事件3
    C# 事件2
    C# 事件
  • 原文地址:https://www.cnblogs.com/wjw-blog/p/11219949.html
Copyright © 2011-2022 走看看