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 {
    	void *data;
    	struct LINKNODE *next;
    } LinkNode;
    
    //链表结构体
    typedef struct LINKLIST {
    	LinkNode *head;
    	int size;
    }LinkList;
    
    //打印函数指针
    typedef void(*PRINTLINKNODE)(void *);
    
    //初始化链表
    LinkList * Init_LinkList();
    //在指定位置插入
    void Insert_LinkList(LinkList *list, int pos, void *data);
    
    //删除指定位置的值
    void RemoveByPos_LinkList(LinkList *list, int pos);
    
    //获得链表的长度
    int Size_LinkList(LinkList *list);
    
    //查找
    int Find_LinkList(LinkList *list, void* data);
    
    //打印链表节点
    void Print_LinkList(LinkList *list, PRINTLINKNODE print);
    
    // 返回第一个节点
    void *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->size = 0;
    
    	//头节点 是不保存数据信息的
    	list->head = (LinkNode *)malloc(sizeof(LinkNode));
    	list->head->data = NULL;
    	list->head->next = NULL;
    
    	return list;
    }
    //在指定位置插入
    void Insert_LinkList(LinkList *list, int pos, void *data){
    	if(list == NULL) {
    		return;
    	}
    	if(data == NULL) {
    		return;
    	}
    
    	//安全验证
    	if(pos < 0 || pos > list->size) {
    		pos = list->size;
    	}
    
    	//创建新的节点
    	LinkNode *newnode = (LinkNode *)malloc(sizeof(LinkNode));
    	newnode->data = data;
    	newnode->next = NULL;
    
    	//找节点
    	//辅助指针变量
    	LinkNode *pCurrent = list->head;
    	for(int i = 0; i < pos; i++) {
    		pCurrent = pCurrent->next;
    	}
    
    	//新节点加入链表
    	newnode->next = pCurrent->next;
    	pCurrent->next = newnode;
    	list->size++;
    
    }
    
    //删除指定位置的值
    void RemoveByPos_LinkList(LinkList *list, int pos) {
    	if(list == NULL){
    		return;
    	}
    	if(pos < 0 || pos >= list->size){
    		return;
    	}
    
    	//查找删除节点的前一个节点
    	LinkNode *pCurrent = list->head;
    	for(int i = 0; i< pos; i++) {
    		pCurrent = pCurrent->next;
    	}
    
    	//删除节点
    	LinkNode *pDel = pCurrent->next;
    	pCurrent->next = pDel->next;
    	free(pDel);
    
    	list->size--;
    
    }
    
    //获得链表的长度
    int Size_LinkList(LinkList *list) {
    	return list->size;
    }
    
    //查找
    int Find_LinkList(LinkList *list, void* data) {
    	if(list == NULL){
    		return -1;
    	}
    	if(data == NULL){
    		return -1;
    	}
    
    	//遍历查找
    	LinkNode* pCurrent = list->head->next;
    	int i = 0;
    	while(pCurrent != NULL){
    		if(pCurrent->data == data){
    			break;
    		}
    		i++;
    		pCurrent = pCurrent->next;
    	}
    
    	return i;
    }
    
    //打印链表节点
    void Print_LinkList(LinkList *list, PRINTLINKNODE print) {
    	if(list == NULL){
    		return;
    	}
    	//辅助指针变量
    	LinkNode* pCurrent = list->head->next;
    	while(pCurrent != NULL){
    		print(pCurrent->data);
    		pCurrent = pCurrent->next;
    	}
    }
    
    // 返回第一个节点
    void *Front_LinkList(LinkList *list) {
    	return list->head->next->data;
    }
    
    // 释放链表
    void FreeSpace_LinkList(LinkList *list) {
    	if(list == NULL){
    		return;
    	}
    
    	//辅助指针变量
    	LinkNode *pCurrent = list->head;
    	while(pCurrent != NULL){
    		//先缓冲下一个节点
    		LinkNode *pNext = pCurrent->next;
    		free(pCurrent);
    		pCurrent = pNext;
    	}
    
    	//释放链表本身
    	free(list);
    }
    
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "LinkList.h"
    
    typedef struct PERSON {
    	char name[64];
    	int age;
    	int score;
    } Person;
    
    //打印函数
    void MyPrint(void* data){
    	Person *p = (Person *)data;
    	printf("Name: %s Age: %d Score:%d 
    ", p->name, p->age, p->score);
    }
    
    int main(){
    	printf("link list test! 
    ");
    	 //创建链表
    	LinkList *list = Init_LinkList();
    
    	//创建数据
    	Person p1 = {"jarvis",18,100};
    	Person p2 = {"zhangsan",19,99};
    	Person p3 = {"lishi",18,100};
    	Person p4 = {"wangwu",23,70};
    	Person p5 = {"zhaoliu",18,100};
    
    	//数据插入
    	Insert_LinkList(list, 0, &p1);
    	Insert_LinkList(list, 0, &p2);
    	Insert_LinkList(list, 0, &p3);
    	Insert_LinkList(list, 0, &p4);
    	Insert_LinkList(list, 0, &p5);
    
    	printf("--------------------
    ");
    	//打印
    	Print_LinkList(list, MyPrint);
    
    	printf("--------------------
    ");
    	printf("返回第一个结点
    ");
    
    	//返回第一个结点
    	Person *ret = (Person*)Front_LinkList(list);
    	printf("Name: %s Age: %d Score:%d 
    ", ret->name, ret->age, ret->score);
    
    	//销毁链表
    	FreeSpace_LinkList(list);
    
    	system("pause");
    
    	return 0;
    }
    
    
  • 相关阅读:
    SQL注入
    spring+springMVC+hibernate 三大框架整合
    Spring+SpringMVC+MyBatis深入学习及搭建(十三)——SpringMVC入门程序(二)
    Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序(一)
    [Test_HTML5] HTML5笔试题1
    [Hades_BT5] backtrack5 WIFI配置
    [Hades_BT5] BackTrack5网络设置 用国内更新源更新
    [Android_cracker] 最新安卓解包工具
    [Android_cracker] 安卓破译之路
    [Android_cracker] Android DEX安全攻防战
  • 原文地址:https://www.cnblogs.com/wjw-blog/p/11219951.html
Copyright © 2011-2022 走看看