您的位置:首页 > 编程语言 > C语言/C++

用C语言实现单项链表

2016-05-21 17:26 831 查看
用C语言在VS开发工具下写了个单项链表,在此贴出代码,互相学习:

本单项链表由3个文件文件构成,分别为链表头文件LinkList.h 、链表文件 LinkList.c  、测试用例文件main.c

LinkList.h源码:

#ifndef LINKLIST_H
#define LINKLIST_H

#include <stdlib.h>
#include <stdio.h>
#include <memory.h>

//链表结点
typedef struct LINKNODE
{
void* data;//指向任何类型的数据
struct LINKNODE* next;
}LinkNode;

//链表结构体
typedef struct LINKLIST
{
LinkNode head;
int size;
}LinkList;

//打印函数指针
typedef void(*PRINTLINKLIST)(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* Front_LinkList(LinkList* list);

//打印链表结点
void Print_LinkList(LinkList* list, PRINTLINKLIST print);

//释放链表内存
void FreeSpace_LinkList(LinkList* list);

#endif


LinkList.c源码:

#include "LinkList.h"

//初始化链表
LinkList* Init_LinkList()
{
LinkList* list = (LinkList*)malloc(sizeof(LinkList));
//头结点 是不保存数据信息
list->head.data = NULL;
list->head.next = NULL;
list->size = 0;
return list;
}

//指定位置插入节点
void Insert_LinkList(LinkList* list, int pos, void* data)
{
if (list == NULL || data == NULL)
{
return;
}
//友好的处理,pos越界
if (pos < 0 || pos >list->size)
{
pos = list->size;
}
//找结点
//辅助指针变量
LinkNode* pCurrent = &(list->head);
int i = 0;
while (i < pos)
{
pCurrent = pCurrent->next;
i++;
}
//创建新的结点
LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
newNode->data = data;

//新结点入链表
newNode->next = pCurrent->next;
pCurrent->next = newNode;
list->size++;
}

//删除指定位置的节点
void Remove_LinkList(LinkList* list, int pos)
{
if (list == NULL)
{
return;
}
if (pos < 0 || pos >= list->size)
{
return;
}
//查找删除结点的前一个结点
LinkNode* pCurrent = &(list->head);
int i = 0;
while (i < pos)
{
pCurrent = pCurrent->next;
i++;
}
//缓存删除的结点
LinkNode* delNode = pCurrent->next;
pCurrent->next = delNode->next;
//释放删除结点的内存
if (delNode != NULL)
{
free(delNode);
}
list->size--;
}

//获得链表的长度
int Size_LinkList(LinkList* list)
{
if (list == NULL)
{
return -1;
}
return list->size;
}

//查找节点位置
int Find_LinkList(LinkList* list, void* data)
{
if (list == NULL || data == NULL)
{
return -1;
}
//遍历查找
LinkNode* pCurrent = &(list->head);
int pos = -1;
int i = 0;
while (pCurrent->next != NULL)
{
pCurrent = pCurrent-&
4000
gt;next;
if (memcmp(pCurrent->data, data, sizeof(data)) == 0)
{
pos = i;
break;
}
i++;
}
return pos;
}

//返回第一个结点数据
void* Front_LinkList(LinkList* list)
{
if (list == NULL)
{
return NULL;
}
return list->head.next->data;
}

//通过回调函数打印链表结点
void Print_LinkList(LinkList* list, PRINTLINKLIST print)
{
if (list == NULL)
{
return;
}
//辅助指针变量
LinkNode* pCurrent = &(list->head);
while (pCurrent->next != NULL)
{
pCurrent = pCurrent->next;
print(pCurrent->data);
}
}

//释放链表内存
void FreeSpace_LinkList(LinkList* list)
{
if (list == NULL)
{
return;
}
//辅助指针变量
LinkNode* pCurrent = list->head.next;
//缓存要释放的结点
LinkNode* delNode = NULL;
while (pCurrent != NULL)
{
delNode = pCurrent;
pCurrent = pCurrent->next;
if (delNode != NULL)
{
free(delNode);
}
}
//释放链表内存
list->size = 0;
free(list);
}


main.c源码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "LinkList.h"

//自定义数据类型
typedef struct PERSON
{
char name[20];
int age;
}Person;

//打印函数
void MyPrint(Person* p)
{
if (p == NULL)
{
return;
}
printf("Name:%s   Age:%d\n", p->name, p->age);
}
int main(void)
{
//创建数据
Person p1 = { "aaa", 21 };
Person p2 = { "bbb", 22 };
Person p3 = { "ccc", 23 };
Person p4 = { "ddd", 24 };
Person p5 = { "eee", 25 };
Person p6 = { "fff", 26 };

//创建链表
LinkList* list = Init_LinkList();

//数据插入链表
Insert_LinkList(list, 0, &p1);
Insert_LinkList(list, 0, &p2);
Insert_LinkList(list, 0, &p3);
Insert_LinkList(list, 0, &p4);
Insert_LinkList(list, 2, &p5);
Insert_LinkList(list, 0, &p6);

//打印链表
Print_LinkList(list, MyPrint);
printf("链表大小:%d\n", Size_LinkList(list));
printf("----------------------\n");

// 删除某节点
Remove_LinkList(list, 4);
Print_LinkList(list, MyPrint);
printf("链表大小:%d\n", Size_LinkList(list));
printf("----------------------\n");

//查找某节点的位置
printf("p3的位置:%d\n", Find_LinkList(list, &p3));
printf("----------------------\n");

//获取第一个节点
Person* p = Front_LinkList(list);
MyPrint(p);
printf("----------------------\n");

//销毁链表
FreeSpace_LinkList(list);
printf("\n");
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: