seqlink.h
#include<stdio.h>
#pragma once
//单向链表
//双向链表
//
typedef char LinkNodeType;
typedef struct LinkNode {
LinkNodeType data;
struct LinkNode* next;
//next = NULL 结束标志 不带环
//next = 第一个节点位置 带环
//
//带头结点
//不带头节点
} LinkNode;
LinkNode* CreatNode(LinkNodeType value);//创造新节点
// 初始化链表
void LinkListInit(LinkNode** node);
void LinkListPrintChar(LinkNode* head,const char* msg);
void LinkListDestory(LinkNode** head );
//尾插一个元素到链表中
void LinkListPushBack(LinkNode** head, LinkNodeType value);
void LinkListPopBack(LinkNode** head);//尾删
void LinkListPushFrout(LinkNode** head,LinkNodeType value);//头插
void LinkListPopFourt(LinkNode** head);//头删
void LinkListInsert(LinkNode*pos,LinkNodeType value);
//新节点插入在pos之后
void LinkListEarse(LinkNode** head,LinkNode* pos);//删除指定位置
LinkNode* LinkListFind(LinkNode* head,LinkNodeType value);//查找位置
void LinkListInsertBef(LinkNode** head,LinkNode* pos,LinkNodeType value);
//在pos之前插入元素
void LinkListDelVal(LinkNode** head,LinkNodeType value);//删除指定元素
void LinkListDelAll(LinkNode** head,LinkNodeType value);//删除相同元素
size_t LinkListSize(LinkNode* head);//元素个数
seqlink.c
#include<stdio.h>
#include"seqlink.h"
#include<stdlib.h>
LinkNode* CreatNode(LinkNodeType value)
{
LinkNode* NewNode = (LinkNode*)malloc(sizeof(LinkNode));
NewNode->data = value;
NewNode->next = NULL;
return NewNode;
}
void DestoryNode(LinkNode* node)
{
free(node);
}
void LinkListInit(LinkNode** node)
{
//if(node == NULL)
//{
// //error
// printf("非法输入!\n");
// return;
//}
*node = NULL;
}
void LinkListDestory(LinkNode** head)
{
if(head == NULL)
{
//error
return;
}
if(*head == NULL)
{
//空链表
return;
}
LinkNode* cur = *head;
while(*head)
{
cur = (*head)->next;
DestoryNode(*head);
*head = cur;
}
return;
}
void LinkListPushBack(LinkNode** head,LinkNodeType value)
{
if(head == NULL)
{
//error
printf("非法输入!\n");
return;
}
if(*head == NULL)
{
//printf("空链表\n");
*head = CreatNode(value);
return;
}
LinkNode* cur = *head;
while(cur->next != NULL)
{
cur = cur->next;
}
LinkNode* NewNode = CreatNode(value);
cur->next = NewNode;
// NewNode->next = NULL;没必要 CreatNode中已经实现置空
return;
}
void LinkListPrintChar(LinkNode* head,const char* msg)
{
printf("[%s]\n",msg);
LinkNode* cur = head;
for(;cur != NULL;cur = cur->next)
{
printf("[%c|%p]\t",cur->data,cur);
}
printf("\n");
}
void LinkListPopBack(LinkNode** head)
{
if(head == NULL)
{
//error
return;
}
if(*head == NULL)
{
//printf("空链表!\n");
return;
}
if((*head)->next == NULL)
{
//只有一个元素
DestoryNode(*head);
*head = NULL;
return;
}
LinkNode* pre = NULL;
LinkNode* cur = *head;
while(cur->next != NULL)
{
pre = cur;
cur = cur->next;
//cur指向最后一个节点
//pre指向倒数第二个节点
}
pre->next = NULL;
DestoryNode(cur);
return;
}
void LinkListPushFrout(LinkNode** head,LinkNodeType value)
{
if(head == NULL)
{
//error
return;
}
LinkNode* NewNode = CreatNode(value);
NewNode->next = *head;
*head = NewNode;
return;
}
void LinkListPopFourt(LinkNode** head)
{
if(head == NULL)
{
//error
return;
}
if(*head == NULL)
{
//空链表
return;
}
LinkNode* cur = *head;
*head = (*head)->next;
DestoryNode(cur);
return;
}
void LinkListInsert(LinkNode*pos,LinkNodeType value)
{
//if(head == NULL)
//{
// //空链表
// return
//}
if(pos == NULL)
{
//error
//pos表示节点指针 若为null 不存在节点
return;
}
LinkNode* NewNode = CreatNode(value);
NewNode->next = pos->next;
pos->next = NewNode;
return;
}
void LinkListEarse(LinkNode** head,LinkNode* pos)
{
if(head == NULL || pos == NULL)
{
//error
return;
}
if(*head == NULL)
{
//空链表
return;
}
LinkNode* cur = *head;
for(;cur != NULL;cur= cur->next)
{
if(cur->next == pos)
{
break;
}
}
//退出原因
if(cur == NULL)
{
return;
}
cur->next = pos->next;
DestoryNode(pos);
}
LinkNode* LinkListFind(LinkNode* head,LinkNodeType value)
{
if(head == NULL)
{
//空链表
return NULL;
}
//找到了返回节点对应的地址,若没有,返回NULL;
LinkNode* cur = head;
for(;cur!=NULL;cur=cur->next)
{
if(cur->data == value)
{
return cur;
}
}
return NULL;
}
void LinkListInsertBef(LinkNode** head,LinkNode* pos,LinkNodeType value)
{
if(head == NULL)
{
//error
return;
}
if(*head == NULL)
{
//空链表
return;
}
if(pos == NULL)
{
return;
}
LinkNode* NewNode = CreatNode(value);
NewNode->next = pos->next;
pos->next = NewNode;
NewNode->data = pos->data;
pos->data = value;
return;
}
void LinkListDelVal(LinkNode** head,LinkNodeType value)
{
if(head == NULL)
{
//error
return;
}
if(*head == NULL)
{
//error
return;
}
LinkNode* cur = *head;
LinkNode* pos = LinkListFind(*head,value);
for(;cur!=NULL;cur=cur->next)
{
if(cur->next->data == value)
break;
}
if(cur == NULL)
{
return;
}
cur->next = pos->next;
DestoryNode(pos);
}
void LinkListDelAll(LinkNode** head,LinkNodeType value)
{
if(head == NULL)
{
//error
return;
}
if(*head == NULL)
{
//error
return;
}
LinkNode* cur = *head;
while(cur != NULL)
{
while(cur->data == value)
{
cur = cur->next;
}
*head = cur;
LinkNode* pos = *head;
cur = cur->next;
while(cur != NULL)
{
if(cur->data != value)
{
pos->next = cur;
pos = pos->next;
}
cur = cur->next;
}
pos->next = NULL;
pos = pos->next;
DestoryNode(pos);
}
return;
}
size_t LinkListSize(LinkNode* head)
{
if(head == NULL)
{
//空链表
return 0;
}
LinkNode* pos = head;
size_t count = 0;
while(pos != NULL)
{
++count;
pos = pos->next;
}
return count;
}
//Test Code
/////////////////////////////////
void TestInit()
{
LinkNode* head;
LinkListInit(&head);
}
void TestPushBack()
{
LinkNode* head;
LinkListInit(&head);
LinkListPushBack(&head ,'a');
LinkListPushBack(&head ,'b');
LinkListPushBack(&head ,'c');
LinkListPushBack(&head ,'d');
LinkListPrintChar(head,"尾插");
}
void TestPopBack()
{
LinkNode* head;
LinkListInit(&head);
LinkListPopBack(&head);
LinkListPrintChar(head,"空链表删除");
LinkListPushBack(&head ,'a');
LinkListPopBack(&head);
LinkListPrintChar(head,"只有一个元素删除");
LinkListPushBack(&head ,'b');
LinkListPushBack(&head ,'c');
LinkListPushBack(&head ,'d');
LinkListPopBack(&head);
LinkListPrintChar(head,"尾删1个元素");
}
void TestLinkListPushFrout()
{
LinkNode* head;
LinkListInit(&head);
LinkListPushFrout(&head,'a');
LinkListPushFrout(&head,'b');
LinkListPushFrout(&head,'c');
LinkListPushFrout(&head,'d');
LinkListPrintChar(head,"头插元素");
}
void TestLinkListPopFrout()
{
LinkNode* head;
LinkListInit(&head);
LinkListPrintChar(head,"空链表头删");
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkListPopFourt(&head);
LinkListPrintChar(head,"头删元素");
}
void TestInster()
{
LinkNode* head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkNode* pos = head->next;
LinkListInsert(pos,'x');
LinkListPrintChar(head,"b之后插入");
}
void TestEarse()
{
LinkNode* head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkNode* pos = head->next;
LinkListEarse(&head,pos);
LinkListPrintChar(head,"删除b位置的元素");
}
void TestFind()
{
LinkNode* head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkListPushBack(&head,'d');
LinkNode* pos = LinkListFind(head,'b');
printf("pos except %p , actual %p\n",head->next,pos);
}
void TestInsterBef()
{
LinkNode* head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkListPushBack(&head,'d');
LinkNode* pos = LinkListFind(head,'d');
LinkListInsertBef(&head,pos,'x');
LinkListPrintChar(head,"在d之前插入x");
}
void TestDelVal()
{
LinkNode* head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkListPushBack(&head,'d');
LinkListDelVal(&head,'b');
LinkListPrintChar(head,"删除元素b");
}
void TestDelAll()
{
LinkNode* head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'k');
LinkListPushBack(&head,'k');
LinkListPushBack(&head,'e');
LinkListPushBack(&head,'t');
LinkListDelAll(&head,'a');
LinkListPrintChar(head,"删除所有a元素");
}
void TestSize()
{
LinkNode* head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkListPushBack(&head,'d');
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'a');
size_t ret = LinkListSize(head);
printf("size = %d\n",ret);
}
void TestDestoryLink()
{
LinkNode* head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkListPushBack(&head,'d');
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'a');
LinkListDestory(&head);
LinkListPrintChar(head,"销毁链表");
}
int main()
{
TestInit();
TestPushBack();
TestPopBack();
TestLinkListPushFrout();
TestLinkListPopFrout();
TestInster();
TestEarse();
TestFind();
TestInsterBef();
TestDelVal();
TestDelAll();
TestSize();
TestDestoryLink();
return 0;
}
单链表的尾删、尾插、头插、头删、随机插、删的操作
最新推荐文章于 2022-12-03 22:08:33 发布