Dlink.h
#ifndef _DLINK_H__
#define _DLINK_H__
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef int T;
typedef struct DNode{
T data;
struct DNode *prev;
struct DNode *next;
}DNode;
typedef struct DLink{
//头尾结点不存储数据
DNode *head;//指向头节点
DNode *tail;//指向尾节点
}DLink;
void init(DLink *dlink);
void clear(DLink *dlink);
void destroy(DLink *dlink);
bool isEmpty(DLink dlink);
size_t size(DLink dlink);
void insertFront(DLink dlink,T data);
void insert(DLink dlink,size_t index,T data);
void deleteByIndex(DLink dlink,size_t index);
void travelFront(DLink dlink);
void travelBack(DLink dlink);
#endif //_DLINK_H__
Dlink.c
#include "dlink.h"
/*
typedef int T;
typedef struct DNode{
T data;
struct DNode *prev;
struct DNode *next;
}DNode;
typedef struct DLink{
//头尾结点不存储数据
DNode *head;//指向头节点
DNode *tail;//指向尾节点
}DLink;
*/
void init(DLink *dlink){
dlink->head = malloc(sizeof(DNode));
dlink->tail = malloc(sizeof(DNode));
dlink->head->prev = NULL;
dlink->head->next = dlink->tail;
dlink->tail->prev = dlink->head;
dlink->tail->next = NULL;
}
void clear(DLink *dlink){
DNode *node = dlink->head->next;
while(node != dlink->tail){
DNode *next = node->next;
free(node);
node = next;
}
dlink->head->next = dlink->tail;
dlink->tail->prev = dlink->head;
}
void destroy(DLink *dlink){
clear(dlink);
free(dlink->head);
dlink->head = NULL;
free(dlink->tail);
dlink->tail = NULL;
}
bool isEmpty(DLink dlink){
return dlink.head->next == dlink.tail && dlink.head == dlink.tail->prev;
}
size_t size(DLink dlink){
DNode *node = dlink.head->next;
size_t cnt = 0;
while(node != dlink.tail){
cnt++;
node = node->next;
}
return cnt;
}
void insertFront(DLink dlink,T data){
DNode *node = malloc(sizeof(DNode));
node->data = data;
node->next = dlink.head->next;
node->prev = dlink.head;
dlink.head->next->prev = node;
dlink.head->next = node;
}
static DNode * getPrevNode(DLink dlink,size_t index){
DNode *node = dlink.head;
for(int i=0;i<index;i++){
node = node->next;
}
return node;
}
void insert(DLink dlink,size_t index,T data){
if(index > size(dlink)){
return;
}
DNode *prevNode = getPrevNode(dlink,index);
DNode *node = malloc(sizeof(DNode));
node->data = data;
node->next = prevNode->next;
node->prev = prevNode;
prevNode->next->prev = node;
prevNode->next = node;
}
void deleteByIndex(DLink dlink,size_t index){
if(index >= size(dlink)){
return;
}
DNode *currNode = getPrevNode(dlink,index+1);
currNode->next->prev = currNode->prev;
currNode->prev->next = currNode->next;
free(currNode);
}
void travelFront(DLink dlink){
DNode *node = dlink.head->next;
while(node != dlink.tail){
printf("%d ",node->data);
node = node->next;
}
printf("\n");
}
void travelBack(DLink dlink){
DNode *node = dlink.tail->prev;
while(node != dlink.head){
printf("%d ",node->data);
node = node->prev;
}
printf("\n");
}
Test.c
#include "dlink.h"
int main(){
DLink dlink;
init(&dlink);
if(isEmpty(dlink)){
printf("空空如也!\n");
}else{
printf("非空!\n");
}
insertFront(dlink,1);
insertFront(dlink,2);
insertFront(dlink,3);
insertFront(dlink,4);
insertFront(dlink,5);
insertFront(dlink,6);
insert(dlink,5,7);
insert(dlink,3,8);
insert(dlink,2,9);
insert(dlink,8,10);
printf("%u \n",size(dlink));
travelFront(dlink);
travelBack(dlink);
deleteByIndex(dlink,5);
deleteByIndex(dlink,4);
deleteByIndex(dlink,5);
deleteByIndex(dlink,2);
travelFront(dlink);
travelBack(dlink);
destroy(&dlink);
return 0;
}
本文详细介绍了双向链表的数据结构实现及操作方法,包括初始化、插入、删除等关键功能,并通过示例代码展示了如何在C语言中使用双向链表。
1004

被折叠的 条评论
为什么被折叠?



