单链表实现源码

来源:互联网 发布:最优化袁亚湘 编辑:程序博客网 时间:2024/05/17 01:03

单链表实现代码

1.头文件

/*LinkList.h*/#pragma #include <stdio.h>#include <stdlib.h>typedef struct _LinkNode{void *data;struct _LinkNode *next;}LinkNode;/*头节点结构体*/typedef struct _LinkHead{LinkNode Head;int size;}LinkHead;typedef void * LINKLIST;/*打印函数指针*/typedef void(DATA_PRINT)(void *);/*初始化头节点*/LINKLIST Init_LinkList();/*指定位置插入*/void Insert_LinkList(LINKLIST list, int pos, LINKLIST data);/*指定位置删除*/void Remove_LinkList(LINKLIST list, int pos);/*链表节点数*/int Size_LinkList(LINKLIST list);/*打印链表*/void Print_LinkList(LINKLIST list, DATA_PRINT print);/*释放内存*/void Destroy_LinkList(LINKLIST list);

2.实现代码

/*LinkList.c*/#include "LinkList.h"/*头节点初始化*/LINKLIST Init_LinkList(){LinkHead *head = (LinkHead*)malloc(sizeof(LinkHead));if (head == NULL){return NULL;}head->Head.next = NULL;head->size = 0;return head;}/*指定位置插入*/void Insert_LinkList(LINKLIST list, int pos, LINKLIST data){if (list == NULL){return NULL;}if (data == NULL){return NULL;}LinkHead *head = (LinkHead *)list;/*判断是否越界*/if (pos < 0 || pos > head->size){pos = head->size;}/*查找插入的位置*/LinkNode *pCurrent = &(head->Head);for (int i = 0; i < pos; i++){pCurrent = pCurrent->next;}/*创建节点*/LinkNode *newNode = (LinkNode *)malloc(sizeof(LinkNode));newNode->data = data;newNode->next = NULL;/*新节点加入链表*/newNode->next = pCurrent->next;pCurrent->next = newNode;head->size++;}/*指定位置删除*/void Remove_LinkList(LINKLIST list, int pos){if (list == NULL){return NULL;}LinkHead *head = (LinkHead *)list;/*判断是否越界*/if (pos < 0 || pos >= head->size){return NULL;}/*查找结点位置*/LinkNode *pCurrent = &(head->Head);for (int i = 0; i < pos; i++){pCurrent = pCurrent->next;}/*缓存节点*/LinkNode *pDel = pCurrent->next;/*删除节点*/pCurrent->next = pDel->next;free(pDel);head->size--;}/*链表节点数*/int Size_LinkList(LINKLIST list){if (list == NULL){return -1;}LinkHead *head = (LinkHead *)list;return head->size;}/*打印链表*/void Print_LinkList(LINKLIST list, DATA_PRINT print){if (list == NULL){return NULL;}LinkHead *head = (LinkHead *)list;LinkNode *pCurrent = &(head->Head);/*遍历链表*/for (int i = 0; i < head->size; i++){pCurrent = pCurrent->next;print(pCurrent->data);}}/*释放内存*/void Destroy_LinkList(LINKLIST list){if (list == NULL){return NULL;}LinkHead *head = (LinkHead *)list;LinkNode *pCurrent = head->Head.next;free(head);LinkNode *pDel = pCurrent;/*遍历链表*/for (int i = 0; i < head->size - 1; i++){pCurrent = pCurrent->next;free(pDel);pDel = pCurrent;}}

3.测试文件

/*test.c*/#include <stdio.h>#include <stdlib.h>#include "LinkList.h"/*数据结构体*/typedef struct _PERSON{char name[64];int age;}Person;/*打印结构体数据函数*/void MyPrint(LINKLIST data){if (data == NULL){return NULL;}Person *person = (Person *)data;printf("name:%s\t age:%d\n", person->name, person->age);}/*测试*/void test(){Person p1 = { "aaa", 11 };Person p2 = { "bbb", 22 };Person p3 = { "ccc", 33 };Person p4 = { "ddd", 44 };Person p5 = { "eee", 55 };LINKLIST list = Init_LinkList();Insert_LinkList(list, 1, &p1);Insert_LinkList(list, 2, &p2);Insert_LinkList(list, 3, &p3);Insert_LinkList(list, 4, &p4);Insert_LinkList(list, 5, &p5);Print_LinkList(list, MyPrint);printf("--------------------------------\n");Remove_LinkList(list, 3);Print_LinkList(list, MyPrint);printf("--------------------------------\n");int size = Size_LinkList(list);printf("size = %d\n", size);Destroy_LinkList(list);}int main(){test();system("pause");return 0;}



0 0