此单向链表无头结点,不带环
linklist.h
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef char LinkType;
typedef struct LinkNode
{
LinkType data;
struct LinkNode* next;
} LinkNode;
void LinkListInit(LinkNode** head);//初始化链表
LinkNode* LinkListPushBack(LinkNode** head, LinkType value);//尾插一个元素
void LinkListPopBack(LinkNode** head);//尾删一个元素
void LinkListPushFront(LinkNode** head, LinkType value);//头插一个元素
void LinkListPopFront(LinkNode** head);//头删一个元素
LinkNode* LinkListFind(LinkNode* head, LinkType to_find);//查找元素在链表中的位置
void LinkListInsertBefore(LinkNode** head, LinkNode* pos, LinkType value);//在pos之前插入元素
void LinkListInsertAfter(LinkNode** head, LinkNode* pos, LinkType value);//在pos之后插入元素
void LinkListErase1(LinkNode** head, LinkNode* pos);//删除指定位置的元素
void LinkListErase2(LinkNode* head, LinkNode* pos);
void LinkListRemove1(LinkNode** head, LinkType to_delete);//删除指定值的元素
void LinkListRemove2(LinkNode** head, LinkType to_delete);
void LinkListRemoveAll(LinkNode** head, LinkType value);//指定值的所有元素都删掉
int LinkListIsEmpty(LinkNode* head);//判定链表为空
size_t LinkListSize(LinkNode* head);//求链表的元素个数
linklist.c
#include "linklist.h"
//初始化链表
void LinkListInit(LinkNode** head)
{
if (head == NULL)
return;
*head = NULL;
}
LinkNode* LinkListGreateNode(LinkType value)
{
LinkNode* ptr = (LinkNode*)malloc(sizeof(LinkNode));//(malloc)ptr在堆上创建,可以return ptr
//LinkNode node;
//LinkNode* ptr = &node;//错误! ptr在栈上创建,不可以return ptr
ptr->data = value;
ptr->next = NULL;
return ptr;
}
//尾插一个元素到链表中
LinkNode* LinkListPushBack(LinkNode** head, LinkType value)
{
LinkNode* cur = *head;
if (head == NULL)
return NULL;
if (*head == NULL)
{
*head = LinkListGreateNode(value);
return *head;
}
while (cur->next != NULL)
{
cur = cur->next;
}
cur->next = LinkListGreateNode(value);
return cur->next;
}
void LinkListDestroyNode(LinkNode* ptr)
{
free(ptr);
}
//尾删一个元素
void LinkListPopBack(LinkNode** head)
{
LinkNode* cur = *head;
if (head == NULL)
return;
if (*head == NULL)
return;
if (cur->next == NULL)
{
LinkListDestroyNode(cur);
*head = NULL;
return;
}
while (cur->next != NULL)
{
if (cur->next->next == NULL)
{
LinkNode* to_delete = cur->next;
cur->next = NULL;
LinkListDestroyNode(to_delete);
return;
}
cur = cur->next;
}
}
//头插一个元素
void LinkListPushFront(LinkNode** head, LinkType value)
{
if (head == NULL)
return;
if (*head == NULL)
{
*head = LinkListGreateNode(value);
return;
}
LinkNode* new_node = LinkListGreateNode(value);
new_node->next = *head;
*head = new_node;
return;
}
//头删一个元素
void LinkListPopFront(LinkNode** head)
{
LinkNode* to_delete = *head;
if (head == NULL)
return;
if (*head == NULL)
return;
*head = to_delete->next;
LinkListDestroyNode(to_delete);
}
//查找元素在链表中的位置
LinkNode* LinkListFind(LinkNode* head, LinkType to_find)
{
LinkNode* cur = head;
for (; cur != NULL; cur = cur->next)
{
if (cur->data == to_find)
return cur;
}
return NULL;
}
//在pos之前插入元素
void LinkListInsertBefore(LinkNode** head, LinkNode* pos, LinkType value)
{
LinkNode* cur = *head;
if (head == NULL)
return;
if (*head == NULL)
{
*head = LinkListGreateNode(value);
return;
}
if (*head = pos)
{
LinkListPushFront(head, value);
return;
}
if (pos == NULL)
{
LinkListPushBack(head, value);
return;
}
while (cur->next != NULL)
{
if (cur->next == pos)
{
LinkNode* new_node = LinkListGreateNode(value);
new_node->next = pos;
cur->next = new_node;
return;
}
cur = cur->next;
}
return;
}
//在pos之后插入元素
void LinkListInsertAfter(LinkNode** head, LinkNode* pos, LinkType value)
{
LinkNode* new_node = LinkListGreateNode(value);
if (head == NULL)
return;
if (pos == NULL)
return;
new_node->next = pos->next;
pos->next = new_node;
return;
}
//删除指定位置的元素
void LinkListErase1(LinkNode** head, LinkNode* pos)
{
LinkNode* cur = *head;
if (head == NULL)
return;
if (*head == NULL)
return;
if (*head == pos)
{
LinkNode* to_delete = *head;
*head = to_delete->next;
LinkListDestroyNode(to_delete);
return;
}
while (cur->next != NULL)
{
if (cur->next == pos)
{
cur->next = pos->next;
LinkListDestroyNode(pos);
return;
}
cur = cur->next;
}
return;
}
void LinkListErase2(LinkNode* head, LinkNode* pos)
{
if (head == NULL)
return;
if (pos != NULL && pos->next != NULL)
{
pos->data = pos->next->data;
LinkNode* to_delete = pos->next;
pos->next = to_delete->next;
LinkListDestroyNode(to_delete);
return;
}
return;
}
//删除指定值的元素
void LinkListRemove1(LinkNode** head, LinkType to_delete)
{
LinkNode* pos = LinkListFind(*head, to_delete);
if (head == NULL)
return;
if (*head == NULL)
return;
LinkListErase1(head, pos);
return;
}
void LinkListRemove2(LinkNode** head, LinkType to_delete)
{
if (head == NULL)
return;
if (*head == NULL)
return;
if ((*head)->data == to_delete)
{
LinkNode* delete = *head;
*head = delete->next;
LinkListDestroyNode(delete);
return;
}
LinkNode* cur = (*head)->next;
LinkNode* pre = *head;
while (cur != NULL)
{
if (cur->data == to_delete)
{
pre->next = cur->next;
LinkListDestroyNode(cur);
return;
}
cur = cur->next;
pre = pre->next;
}
return;
}
//指定值的所有元素都删掉
void LinkListRemoveAll(LinkNode** head, LinkType value)
{
if (head == NULL)
return;
if (*head == NULL)
return;
while (1)
{
LinkNode* pos = LinkListFind(*head, value);
if (pos == NULL)
return;
LinkListErase1(head, pos);
}
return;
}
//判定链表为空
int LinkListIsEmpty(LinkNode* head)
{
return head == NULL ? 1 : 0;
}
//求链表的元素个数
size_t LinkListSize(LinkNode* head)
{
size_t count = 0;
LinkNode* cur = head;
if (head = NULL)
return -1;
while (cur != NULL)
{
++count;
cur = cur->next;
}
return count;
}
//
//以下为测试代码//
/
#define TEST_HEADER printf("\n**********%s**********\n",__FUNCTION__)
void LinkListPrintf(LinkNode* head, char* msg)
{
printf("%s\n", msg);
LinkNode* cur = head;
for (; cur != NULL; cur = cur->next)
{
printf("[%c:%p] -> ", cur->data, cur);
}
printf("[NULL]\n");
}
void TestInit()
{
TEST_HEADER;
LinkNode* head;
LinkListInit(&head);
LinkListPrintf(head, "初始化链表");
printf("[head]=%p,head=%ld\n", head, (long)head);
}
void TestPushBack()
{
TEST_HEADER;
LinkNode* head;
LinkListInit(&head);
LinkListPushBack(&head, 'a');
LinkListPushBack(&head, 'b');
LinkListPushBack(&head, 'c');
LinkListPushBack(&head, 'd');
LinkListPushBack(&head, 'e');
LinkListPrintf(head, "尾插五个元素");
}
void TestLinkListPopBack()
{
TEST_HEADER;
LinkNode* head;
LinkListInit(&head);
LinkListPushBack(&head, 'a');
LinkListPushBack(&head, 'b');
LinkListPushBack(&head, 'c');
LinkListPushBack(&head, 'd');
LinkListPushBack(&head, 'e');
LinkListPrintf(head, "尾插五个元素");
LinkListPopBack(&head);
LinkListPopBack(&head);
LinkListPrintf(head, "尾删两个元素");
}
void TestPushFront()
{
TEST_HEADER;
LinkNode* head;
LinkListInit(&head);
LinkListPushBack(&head, 'a');
LinkListPushBack(&head, 'b');
LinkListPushBack(&head, 'c');
LinkListPrintf(head, "尾插三个元素");
LinkListPushFront(&head, 'd');
LinkListPushFront(&head, 'e');
LinkListPrintf(head, "头插两个元素");
}
void TestPopFront()
{
TEST_HEADER;
LinkNode* head;
LinkListInit(&head);
LinkListPushBack(&head, 'a');
LinkListPushBack(&head, 'b');
LinkListPushBack(&head, 'c');
LinkListPushBack(&head, 'd');
LinkListPushBack(&head, 'e');
LinkListPrintf(head, "尾插五个元素");
LinkListPopFront(&head);
LinkListPopFront(&head);
LinkListPrintf(head, "头删两个元素");
}
void TestFind()
{
TEST_HEADER;
LinkNode* head;
LinkListInit(&head);
LinkListPushBack(&head, 'a');
LinkNode* pos_b = LinkListPushBack(&head, 'b');
LinkListPushBack(&head, 'c');
LinkListPushBack(&head, 'd');
LinkListPushBack(&head, 'e');
LinkListPrintf(head, "尾插五个元素");
LinkNode* pos = LinkListFind(head, 'b');
printf("pos b expect %p,actual %p\n", pos_b, pos);
}
void TestInsertBefore()
{
TEST_HEADER;
LinkNode* head;
LinkListInit(&head);
LinkListPushBack(&head, 'a');
LinkListPushBack(&head, 'b');
LinkListPushBack(&head, 'c');
LinkListPrintf(head, "尾插三个元素");
LinkNode* pos = LinkListFind(head, 'a');
LinkListInsertBefore(&head, pos, 'd');
LinkListPrintf(head, "在下标0之前插入元素'd'");
}
void TestInsertAfter()
{
TEST_HEADER;
LinkNode* head;
LinkListInit(&head);
LinkListPushBack(&head, 'a');
LinkListPushBack(&head, 'b');
LinkListPushBack(&head, 'c');
LinkListPrintf(head, "尾插三个元素");
LinkNode* pos = LinkListFind(head, 'a');
LinkListInsertAfter(&head, pos, 'd');
LinkListPrintf(head, "在下标0之后插入元素'd'");
}
void TestErase()
{
TEST_HEADER;
LinkNode* head;
LinkListInit(&head);
LinkListPushBack(&head, 'a');
LinkListPushBack(&head, 'b');
LinkListPushBack(&head, 'c');
LinkListPushBack(&head, 'd');
LinkListPushBack(&head, 'e');
LinkListPrintf(head, "尾插五个元素");
LinkNode* pos1 = LinkListFind(head, 'a');
LinkListErase1(&head, pos1);
LinkListPrintf(head, "删除下标为0的元素'a'");
LinkNode* pos2 = LinkListFind(head, 'c');
LinkListErase2(head, pos2);
LinkListPrintf(head, "删除下标为1的元素'c'");
}
void TestRemove()
{
TEST_HEADER;
LinkNode* head;
LinkListInit(&head);
LinkListPushBack(&head, 'a');
LinkListPushBack(&head, 'b');
LinkListPushBack(&head, 'c');
LinkListPushBack(&head, 'd');
LinkListPushBack(&head, 'e');
LinkListPrintf(head, "尾插五个元素");
LinkListRemove2(&head, 'b');
LinkListPrintf(head, "删除指定值的元素'b'");
}
void TestRemoveAll()
{
TEST_HEADER;
LinkNode* head;
LinkListInit(&head);
LinkListPushBack(&head, 'a');
LinkListPushBack(&head, 'b');
LinkListPushBack(&head, 'b');
LinkListPushBack(&head, 'b');
LinkListPushBack(&head, 'c');
LinkListPrintf(head, "尾插五个元素");
LinkListRemoveAll(&head, 'b');
LinkListPrintf(head, "指定值的所有元素'b'都删掉");
}
void TestIsEmpty()
{
TEST_HEADER;
LinkNode* head;
LinkListInit(&head);
int ret = LinkListIsEmpty(head);
printf("%d\n", ret);
}
void TestSize()
{
TEST_HEADER;
LinkNode* head;
LinkListInit(&head);
LinkListPushBack(&head, 'a');
LinkListPushBack(&head, 'b');
LinkListPushBack(&head, 'b');
LinkListPushBack(&head, 'b');
LinkListPushBack(&head, 'c');
LinkListPrintf(head, "尾插五个元素");
size_t size = LinkListSize(head);
printf("size=%d\n", size);
}
int main()
{
TestInit();
TestPushBack();
TestLinkListPopBack();
TestPushFront();
TestPopFront();
TestFind();
TestInsertBefore();
TestInsertAfter();
TestErase();
TestRemove();
TestRemoveAll();
TestIsEmpty();
TestSize();
system("pause");
return 0;
}
时间复杂度: