dlinklist.h
#pragma once
#include<stdio.h>
typedef char DLinkType;
typedef struct DLinkNode {
DLinkType data;
struct DLinkNode* next;
struct DLinkNode* prev;
} DLinkNode;
void DLinkListErase(DLinkNode* pos,DLinkType value); //修改指定元素
void DLinkListRemove(DLinkNode* head,DLinkNode* pos); //删除指定元素
void DLinkListRemoveAll(DLinkNode* head,DLinkType value); //删除相同元素
size_t DLinkListSize(DLinkNode* head); //计算链表元素个数
int DLinkListEmpty(DLinkNode** head);//清空链表
dlinklist.c
#include<stdio.h>
#include<stdlib.h>
#include"dlinklist.h"
void DLinkListErase(DLinkNode* pos,DLinkType value)
{
if(pos == NULL)
{
//error
return;
}
pos->data = value;
}
void DLinkListRemoveAll(DLinkNode* head,DLinkType value)
{
if(head == NULL)
{
//error
return;
}
DLinkNode* cur = head->next;
while(cur != head)
{
if(cur->data == value)
{
DLinkNode* Prev = cur->prev;
DLinkNode* Next = cur->next;
Prev->next = Next;
Next->prev = Prev;
free(cur);
}
cur = cur->next;
}
}
void DLinkListRemove(DLinkNode* head,DLinkNode* pos)
{
if(head == NULL|| pos == NULL)
{
//error
return;
}
DLinkNode* Prev = pos->prev;
DLinkNode* Next = pos->next;
Prev->next = Next;
Next->prev = Prev;
free(pos);
}
size_t DLinkListSize(DLinkNode* head)
{
if(head == NULL)
{
return 0;
}
DLinkNode* cur = head->next;
size_t count = 0;
while(cur != head)
{
++count;
cur = cur->next;
}
return count;
}
int DLinkListEmpty(DLinkNode** head)
{
if(head == NULL)
{
return -1;
}
if(*head == NULL)
{
return -2;
}
DLinkNode* cur = (*head)->next;
DLinkNode* pre = NULL;
while(cur != *head)
{
pre = cur;
cur = cur->next;
free(pre);
}
free(cur);
*head = NULL;
return 0;
}
/测试代码
void TestErase()
{
DLinkNode* head;
DLinkListInit(&head);
DLinkListPushBack(head,'a');
DLinkListPushBack(head,'b');
DLinkListPushBack(head,'c');
DLinkListPushBack(head,'d');
DLinkNode* pos = DLinkListFind(head,'c');
DLinkListErase(pos,'x');
DLinkListPrintChar(head,"修改指定元素");
}
void TestRemoveAll()
{
DLinkNode* head;
DLinkListInit(&head);
DLinkListPushBack(head,'a');
DLinkListPushBack(head,'b');
DLinkListPushBack(head,'c');
DLinkListPushBack(head,'d');
DLinkListPushBack(head,'c');
DLinkListRemoveAll(head,'c');
DLinkListPrintChar(head,"删除c");
}
void TestRemove()
{
DLinkNode* head;
DLinkListInit(&head);
DLinkListPushBack(head,'a');
DLinkListPushBack(head,'b');
DLinkListPushBack(head,'c');
DLinkListPushBack(head,'d');
DLinkListPushBack(head,'c');
DLinkNode* pos = DLinkListFind(head,'b');
DLinkListRemove(head,pos);
DLinkListPrintChar(head,"删除b");
}
void TestSize()
{
DLinkNode* head;
DLinkListInit(&head);
DLinkListPushBack(head,'a');
DLinkListPushBack(head,'b');
DLinkListPushBack(head,'c');
DLinkListPushBack(head,'d');
size_t ret = DLinkListSize(head);
printf("ret value num:%lu\n",ret);
}
void TestEmpty()
{
DLinkNode* head;
DLinkListInit(&head);
DLinkListPushBack(head,'a');
DLinkListPushBack(head,'b');
DLinkListPushBack(head,'c');
DLinkListPushBack(head,'d');
DLinkListPrintChar(head,"清空前");
int ret = DLinkListEmpty(&head);
printf("ret = %d\n",ret);
DLinkListPrintChar(head,"清空后");
}
int main()
{
TestErase();
TestRemoveAll();
TestRemove();
TestSize();
TestEmpty();
return 0;
}