//"common.h"
#ifndef _COMMON_H_
#define _COMMON_H_
#include <stdio.h>
#include <windows.h>
#include <stdbool.h>
#include <assert.h>
#include <vld.h>
#pragma warning(disable:4996)
#endif _COMMON_H_
//"dclist.h"
#ifndef _DCLIST_H_
#define _DCLIST_H_
#include "common.h"
// 带头+双向+循环链表增删查改实现
typedef int LTDataType;
typedef struct ListNode
{
LTDataType data;//存放数据
struct ListNode* next;//后继
struct ListNode* prev;//前驱
}ListNode;
// 创建返回链表的头结点.
ListNode* ListCreate();
// 双向链表销毁
void ListDestory(ListNode* pHead);
// 双向链表打印
void ListPrint(ListNode* pHead);
// 双向链表尾插
void ListPushBack(ListNode* pHead, LTDataType x);
// 双向链表尾删
void ListPopBack(ListNode* pHead);
// 双向链表头插
void ListPushFront(ListNode* pHead, LTDataType x);
// 双向链表头删
void ListPopFront(ListNode* pHead);
// 双向链表查找
ListNode* ListFind(ListNode* pHead, LTDataType x);
// 双向链表在pos的前面进行插入
void ListInsert(ListNode* pos, LTDataType x);
// 双向链表删除pos位置的节点
void ListErase(ListNode* pos);
ListNode* BuyNode(LTDataType x)//创建结点
{
ListNode* node = (ListNode*)malloc(sizeof(ListNode));
node->data = x;
node->prev = node->next = NULL;
return node;
}
bool IsEmpty(ListNode* pHead)//判断链表是否为空
{
assert(pHead);
return pHead->prev == pHead;
}
// 创建返回链表的头结点.
ListNode* ListCreate()
{
ListNode* head = (ListNode*)malloc(sizeof(ListNode));
head->prev = head->next = head;
return head;
}
// 双向链表销毁
void ListDestory(ListNode* pHead)
{
assert(pHead);
ListNode* p = pHead->next;
while (p == pHead){
ListNode* q = p->next;
free(p);
p = q;
}
free(pHead);
}
// 双向链表打印
void ListPrint(ListNode* pHead)
{
ListNode* p = pHead->next;
while (p != pHead){
printf("%d->", p->data);
p = p->next;
}
printf("over\n");
}
// 双向链表尾插
void ListPushBack(ListNode* pHead, LTDataType x)
{
assert(pHead);
ListNode* s = BuyNode(x);
s->prev = pHead->prev;
s->next = pHead;
pHead->prev->next = s;
pHead->prev = s;
}
//双向链表尾删
void ListPopBack(ListNode* pHead)
{
assert(pHead);
if (IsEmpty(pHead)){
printf("链表为空,无法删除!\n");
return;
}
ListNode* p = pHead->prev;
pHead->prev = p->prev;
p->prev->next = pHead;
free(p);
}
// 双向链表头插
void ListPushFront(ListNode* pHead, LTDataType x)
{
assert(pHead);
ListNode* s = BuyNode(x);
s->prev = pHead;
s->next = pHead->next;
pHead->next->prev = s;
pHead->next = s;
}
// 双向链表头删
void ListPopFront(ListNode* pHead)
{
assert(pHead);
if (IsEmpty(pHead)){
printf("链表为空,无法删除!\n");
return;
}
ListNode* p = pHead->next;
pHead->next = p->next;
p->next->prev = pHead;
free(p);
}
// 双向链表查找
ListNode* ListFind(ListNode* pHead, LTDataType x)
{
assert(pHead);
if (IsEmpty(pHead)){
printf("链表为空,无法查找!\n");
return NULL;
}
ListNode* p = pHead->next;
while (p != pHead){
if (p->data == x){
return p;
}
p = p->next;
}
return NULL;
}
// 双向链表在pos的前面进行插入
void ListInsert(ListNode* pos, LTDataType x)
{
assert(pos);
ListNode* s = BuyNode(x);
s->prev = pos->prev;
s->next = pos;
pos->prev->next = s;
pos->prev = s;
}
// 双向链表删除pos位置的节点
void ListErase(ListNode* pos)
{
assert(pos);
pos->next->prev = pos->prev;
pos->prev->next = pos->next;
free(pos);
}
#endif _DCLIST_H_
//"main.c"
#include "dclist.h"
int main()
{
int input = 0;
ListNode* list = ListCreate();
ListNode* tmp = NULL;
do{
printf("*****************************************\n");
printf(" 1.push_back 2.pop_back \n");
printf(" 3.push_front 4.pop_front \n");
printf(" 5.show 6.find_val \n");
printf(" 7.insert_pos 8.erase_pos \n");
printf(" 9.destory 0.exit \n");
printf("*****************************************\n");
int select = 0;
printf("请选择:>");
scanf("%d", &select);
switch (select){
case 0:
printf("退出!\n");
return 0;
case 1:
printf("请输入数据(以-1结束):>");
while (scanf("%d", &input) && input != -1){
ListPushBack(list, input);
}
printf("尾插成功!\n");
break;
case 2:
ListPopBack(list);
printf("删除成功!\n");
break;
case 3:
printf("请输入数据(以-1结束):>");
while (scanf("%d", &input) && input != -1){
ListPushFront(list, input);
}
printf("头插成功!\n");
break;
case 4:
ListPopFront(list);
printf("删除成功!\n");
break;
case 5:
ListPrint(list);
break;
case 6:
printf("请输入要查找的值:>");
scanf("%d", &input);
tmp = ListFind(list, input);
if (tmp){
printf("存在!\n");
}
else{
printf("不存在!\n");
}
break;
case 7:
printf("插入到哪个数之前:>");
scanf("%d", &input);
tmp = ListFind(list, input);
printf("请输入要插入的值:>");
scanf("%d", &input);
ListInsert(tmp, input);
printf("插入成功!\n");
break;
case 8:
printf("请输入要删除的值:>");
scanf("%d", &input);
tmp = ListFind(list, input);
ListErase(tmp);
printf("删除成功!\n");
break;
case 9:
ListDestory(list);
printf("摧毁成功!\n");
break;
}
system("pause");
system("cls");
default:
printf("选择错误,请重新选择!\n");
break;
} while (1);
system("pause");
return 0;
}
双链表的增删查改(C语言实现)
最新推荐文章于 2021-11-30 19:39:33 发布