双向链表
head.h
#ifndef __HEAD_H
#define __HEAD_H
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
enum passble{FALSE=-1,SUCCESS};
typedef char datatype;
//双向链表节点的结构体
typedef struct Node
{
//数据域:数据元素
datatype data;
//指针域:上一个节点的地址
struct Node *prev;
//指针域:下一个节点的地址
struct Node *next;
}*Doublelink;
Doublelink create_node();
Doublelink insert_head(datatype element, Doublelink head);
void output(Doublelink head);
Doublelink delete_head(Doublelink head);
Doublelink insert_tail(datatype element, Doublelink head);
Doublelink delete_tail(Doublelink head);
#endif
main.c
#include "head.h"
int main(int argc, const char *argv[])
{
Doublelink head = NULL; //定义双向链表头结点
int n;
printf("please enter n:");
scanf("%d", &n);
datatype element;
//头插
for(int i=0; i<n; i++)
{
printf("please enter %d element:", i+1);
//getchar();
//element = getchar();
scanf(" %c", &element);
head = insert_head(element, head);
}
output(head);
//头删
head = delete_head(head);
output(head);
//尾插
int x;
printf("please enter x:");
scanf("%d", &x);
for(int i=0; i<x; i++)
{
printf("please enter %d element:", i+1);
//getchar();
//element = getchar();
scanf(" %c", &element);
head = insert_tail(element, head);
}
output(head);
//尾删
head = delete_tail(head);
output(head);
return 0;
}
test.c
#include "head.h"
//创建新节点
Doublelink create_node()
{
Doublelink s = (Doublelink)malloc(sizeof(struct Node));
if(s == NULL )
return NULL;
//新节点数据域的初始化
s->data = 0;
//新节点的指针域初始化
s->next = NULL;
s->prev = NULL;
return s;
}
//双向链表的头插
Doublelink insert_head(datatype element, Doublelink head)
{
//创建一个新节点
Doublelink s = create_node();
s->data = element;
//1.链表为空
if(head == NULL)
head = s;
//2.链表不为空(节点数>=1)
else
{
s->next = head;
head->prev = s;
head = s;
}
return head;
}
void output(Doublelink head)
{
//判断链表是否为空
if(head == NULL)
{
printf("The linked list is empty\n");
return ;
}
//循环输出正向
Doublelink p = head;
while(p->next != NULL)
{
printf("%c ", p->data);
p = p->next;
}
printf("%c\n", p->data);
}
//头删
Doublelink delete_head(Doublelink head)
{
//判断链表是否为空
if(head == NULL)
return NULL;
//头删
else
{
Doublelink del = head;
head = head->next;
free(del);
del = NULL;
return head;
}
}
//尾插
Doublelink insert_tail(datatype element, Doublelink head)
{
//创建一个新节点
Doublelink s = create_node();
s->data = element;
//1.判断链表是是否为空
if(head == NULL)
head = s;
//2.链表不为空(节点数>=1)
else
{
Doublelink p = head;
while(p->next)
{
p = p->next;
}
p->next = s;
s->prev = p;
}
s->next = NULL;
return head;
}
//尾删
Doublelink delete_tail(Doublelink head)
{
//判断链表是否为空
if(head == NULL)
return NULL;
//尾删
Doublelink p = head;
while(p->next)
{
p = p->next;
}
if(p->prev != NULL)
{
p->prev->next = NULL;
}
else
head = NULL;
free(p);
return head;
}
双向循环链表
head.h 与main.c参考双向链表代码
test.c
#include "head.h"
//创建新节点
Doublelink create_node()
{
Doublelink s = (Doublelink)malloc(sizeof(struct Node));
if(s == NULL )
return NULL;
//新节点数据域的初始化
s->data = 0;
//新节点的指针域初始化
s->next = s;
s->prev = s;
return s;
}
//双向链表的头插
Doublelink insert_head(datatype element, Doublelink head)
{
//创建一个新节点
Doublelink s = create_node();
s->data = element;
//1.链表为空
if(head == NULL)
head = s;
//2.链表不为空(节点数>=1)
else
{
Doublelink rear = head->prev;
s->next = head;
head->prev = s;
head = s;
rear->next = head;
head->prev = rear;
}
return head;
}
void output(Doublelink head)
{
//判断链表是否为空
if(head == NULL)
{
printf("The linked list is empty\n");
return ;
}
//循环输出正向
Doublelink p = head;
do
{
printf("%c ", p->data);
p = p->next;
}while(p != head);
printf("\n");
}
//头删
Doublelink delete_head(Doublelink head)
{
//判断链表是否为空
if(head == NULL)
return NULL;
//头删
Doublelink del = head;
if(head->next == head)
{
//只有一个节点删除后为空链表
head = NULL;
}
else
{
head->prev->next = head->next;
head->next->prev = head->prev;
head = head->next;
}
}
//尾插
Doublelink insert_tail(datatype element, Doublelink head)
{
//创建一个新节点
Doublelink s = create_node();
s->data = element;
//1.判断链表是是否为空
if(head == NULL)
head = s;
//2.链表不为空(节点数>=1)
else
{
Doublelink rear = head->prev;
s->next = head;
s->prev = rear;
rear->next = s;
head->prev = s;
}
return head;
}
//尾删
Doublelink delete_tail(Doublelink head)
{
//判断链表是否为空
if(head == NULL)
return NULL;
//尾删
Doublelink p = head;
if(head->next == head)
{
free(head);
head = NULL;
}
else
{
p = head->prev;
p->prev->next = head;
head->prev = p->prev;
free(p);
}
return head;
}