1.双向链表
功能函数
#include <stdio.h>
#include <stdlib.h>
#include "./01_doublelinklist.h"
/*
* function: 创建双向链表
* @param [ in]
* @param [out]
* @return
*/
DoubleLinklist* create_doublelinklist()
{
DoubleLinklist* head=(DoubleLinklist*)malloc(sizeof(DoubleLinklist));
if(head==NULL)
{
printf("双向链表创建失败");
return NULL;
}
head->msg.len=0;
head->prev=NULL;
head->next=NULL;
return head;
}
/*
* function: 头插
* @param [ in]
* @param [out]
* @return
*/
int insert_doulielinklist(DoubleLinklist* head,datatype num)
{
DoubleLinklist* temp=(DoubleLinklist*)malloc(sizeof(DoubleLinklist));
if(temp==NULL)
{
printf("创建双向链表失败");
}
temp->msg.data=num;
temp->next=NULL;
temp->prev=NULL;
//修改next指针域
temp->next=head->next;
head->next=temp;
//修改prev指针域
if(temp->next==NULL)
{
temp->prev=head;
head->msg.len++;
}
else
{
temp->prev=temp->next->prev;
temp->next->prev=temp;
head->msg.len++;
}
return head->msg.len;
}
/*
* function: 遍历
* @param [ in]
* @param [out]
* @return
*/
void show_doublelinklist(DoubleLinklist *head)
{
if(head->next==NULL)
{
printf("双向链表为空");
return;
}
DoubleLinklist *p=head;
while(p->next!=NULL)
{
p=p->next;
printf("%d ",p->msg.data);
}
putchar(10);
return;
}
/*
* function: 尾插
* @param [ in]
* @param [out]
* @return
*/
int insert_doulielinklist_tail(DoubleLinklist *head,datatype num)
{
DoubleLinklist* temp=(DoubleLinklist*)malloc(sizeof(DoubleLinklist));
if(temp==NULL)
{
printf("创建双向链表失败");
}
temp->msg.data=num;
temp->next=NULL;
temp->prev=NULL;
DoubleLinklist* p=head;
while(p->next!=NULL)
{
p=p->next;
}
temp->next=p->next;
p->next=temp;
temp->prev=p;
head->msg.len++;
return head->msg.len;
}
/*
* function: 头删
* @param [ in]
* @param [out]
* @return
*/
datatype del_doublelinklist_head(DoubleLinklist *head)
{
if(head->next==NULL)
{
printf("双向链表为空,删除失败");
return (datatype)-1;
}
DoubleLinklist *temp=head->next;
datatype d=temp->msg.data;
//修改next指针
head->next=temp->next;
//修改prev域
if(temp->next!=NULL)
{
temp->next->prev=temp->prev;
}
free(temp);
temp=NULL;
head->msg.len--;
return d;
}
/*
* function: 尾删
* @param [ in]
* @param [out]
* @return
*/
datatype del_doublelinklist_tail(DoubleLinklist *head)
{
if(head->next==NULL)
{
printf("双向链表为空,删除失败");
return (datatype)-1;
}
DoubleLinklist* p=head;
while(p->next->next!=NULL)
{
p=p->next;
}
DoubleLinklist* temp=p->next;
datatype n=temp->msg.data;
p->next=temp->next;
free(temp);
temp=NULL;
head->msg.len--;
return n;
}
/*
* function: 按指定位置插入
* @param [ in]
* @param [out]
* @return
*/
int insert_doulielinklist_ByIndex(DoubleLinklist *head,int index,datatype num)
{
if(head==NULL)
{
printf("链表不存在,插入数据失败");
return -1;
}
if(index<1)
{
printf("数据插入不合法");
return -1;
}
DoubleLinklist* temp=(DoubleLinklist*)malloc(sizeof(DoubleLinklist));
if(temp==NULL)
{
printf("创建双向链表失败");
}
temp->msg.data=num;
temp->next=NULL;
temp->prev=NULL;
DoubleLinklist *p=head;
for(int i=0;i<index-1;i++)
{
p=p->next;
if(p==NULL)
{
printf("错误,插入数据位置不合法");
return -1;
}
}
//修改next域
temp->next=p->next;
p->next=temp;
//修改prev域
temp->prev=p;
if(temp->next!=NULL)
{
temp->next->prev=temp;
}
head->msg.len++;
return head->msg.len;
}
/*
* function: 按指定位置删除
* @param [ in]
* @param [out]
* @return
*/
datatype del_doublelinklist_ByIndex(DoubleLinklist *head,int index)
{
if(head->next==NULL)
{
printf("双向链表为空,删除失败\n");
return (datatype)-1;
}
if(index<1)
{
printf("删除数据位置不合法\n");
return (datatype)-1;
}
DoubleLinklist* p=head;
for(int i=0;i<index;i++)
{
p=p->next;
if(p==NULL)
{
printf("删除数据位置不合法,删除失败\n");
return (datatype)-1;
}
}
datatype d=p->msg.data;
//修改next域
p->prev->next=p->next;
//修改prev域
if(p->next!=NULL)
{
p->next->prev=p->prev;
}
free(p);
p=NULL;
head->msg.len--;
return d;
}
头文件
#ifndef __DOUBLE_LINKLIST_H__
#define __DOUBLE_LINKLIST_H__
typedef int datatype;
typedef struct dblink
{
union
{
int len;
datatype data;
}msg;
struct dblink* prev;
struct dblink* next;
}DoubleLinklist;
//创建双向链表
DoubleLinklist* create_doublelinklist();
//头插
int insert_doulielinklist(DoubleLinklist* head,datatype num);
//遍历
void show_doublelinklist(DoubleLinklist *head);
//尾插
int insert_doulielinklist_tail(DoubleLinklist *head,datatype num);
//头删
datatype del_doublelinklist_head(DoubleLinklist *head);
//尾删
datatype del_doublelinklist_tail(DoubleLinklist *head);
//指定位置插入
int insert_doulielinklist_ByIndex(DoubleLinklist *head,int index,datatype num);
//指定位置删除
datatype del_doublelinklist_ByIndex(DoubleLinklist *head,int index);
#endif
运行结果

2.顺序栈
功能函数
#include <stdio.h>
#include <stdlib.h>
#include "./01_seqlist_stack.h"
int isFull_seqstack(Seqstack *st);
/*
* function: 创建栈
* @param [ in]
* @param [out]
* @return
*/
Seqstack* create_seqlistStack()
{
Seqstack* st=(Seqstack*)malloc(sizeof(Seqstack));
if(st==NULL)
{
printf("栈为空");
return NULL;
}
st->pos=0;
return st;
}
/*
* function: 入栈
* @param [ in]
* @param [out]
* @return
*/
void push_stack(Seqstack *st,datatype num)
{
if(isFull_seqstack(st))
{
printf("满栈,入栈失败");
return;
}
st->data[st->pos]=num;
st->pos++;
return;
}
/*
* function: 出栈
* @param [ in]
* @param [out]
* @return
*/
datatype pop_stack(Seqstack *st)
{
if(st->pos==0)
{
printf("空栈");
return (datatype)-1;
}
st->pos--;
datatype d=st->data[st->pos];
/*
for(int i=st->pos;i>=0;i--)
{
printf("%d ",st->data[i]);
}
*/
return d;
}
/*
* function: 判满
* @param [ in]
* @param [out]
* @return 为满返回1,不满返回0
*/
int isFull_seqstack(Seqstack *st)
{
return st->pos==N?1:0;
}
/*
* function: 遍历栈
* @param [ in]
* @param [out]
* @return
*/
void show_stack(Seqstack *st)
{
if(st->pos==0)
{
printf("空栈");
return;
}
for(int i=0;i<st->pos;i++)
{
printf("%d ",st->data[i]);
}
putchar(10);
return;
}
头文件
#ifndef __SEQLIST_STACK_H__
#define __SEQLIST_STACK_H__
#define N 7
typedef int datatype;
typedef struct
{
datatype data[N];
int pos;
}Seqstack;
//创建栈
Seqstack* create_seqlistStack();
//入栈
void push_stack(Seqstack *st,datatype num);
//出栈
datatype pop_stack(Seqstack *st);
//遍历栈
void show_stack(Seqstack *st);
#endif
运行结果

3.顺序队列
功能函数
#include <stdio.h>
#include <stdlib.h>
#include "./02_seqQueue.h"
/*
* function: 创建队列
* @param [ in]
* @param [out]
* @return
*/
SeqQueue* create_seqQueue()
{
SeqQueue* sq=(SeqQueue*)malloc(sizeof(SeqQueue));
if(sq==NULL)
{
printf("队列为空");
return NULL;
}
sq->front=sq->rear=0;
return sq;
}
/*
* function: 判满
* @param [ in]
* @param [out]
* @return
*/
int isFull_seqQueue(SeqQueue *sq)
{
return (sq->rear+1)%(N+1)==sq->front?1:0;
}
//判空
int isNULL_seqQueue(SeqQueue *sq)
{
return sq->rear==sq->front?1:0;
}
/*
* function: 入队
* @param [ in]
* @param [out]
* @return
*/
void input_seqQueue(SeqQueue *sq,datatype num)
{
if(isFull_seqQueue(sq))
{
printf("队列已满,入队失败");
return;
}
sq->data[sq->rear]=num;
sq->rear=(sq->rear+1)%(N+1);
return;
}
/*
* function: 出队列
* @param [ in]
* @param [out]
* @return
*/
datatype output_seqQueue(SeqQueue *sq)
{
if(isNULL_seqQueue(sq))
{
printf("对列为空,出对失败\n");
return (datatype)-1;
}
datatype n=sq->data[sq->front];
sq->front=((sq->front)+1)%(N+1);
return n;
}
/*
* function: 遍历
* @param [ in]
* @param [out]
* @return
*/
void show_seqQueue(SeqQueue *sq)
{
if(isNULL_seqQueue(sq))
{
printf("对列为空,出对失败");
return;
}
for(int i=sq->front;i!=sq->rear;i=(i+1)%(N+1))
{
printf("%d ",sq->data[i]);
}
putchar(10);
return;
}
/*
* function: 计算个数
* @param [ in]
* @param [out]
* @return
*/
int countNum_seqQueue(SeqQueue* sq)
{
int count;
count=(sq->rear-sq->front+N+1)%(N+1);
return count;
}
头文件
#ifndef __SEQ_QUEUE_H__
#define __SEQ_QUEUE_H__
#define N 5
typedef int datatype;
typedef struct
{
datatype data[N+1];
int front;
int rear;
}SeqQueue;
//创建队列
SeqQueue* create_seqQueue();
//入队操作
void input_seqQueue(SeqQueue *sq,datatype num);
//出队操作
datatype output_seqQueue(SeqQueue *sq);
//遍历
void show_seqQueue(SeqQueue *sq);
//计算个数
int countNum_seqQueue(SeqQueue* sq);
#endif
运行结果

4.链式队列
功能函数
#include <stdio.h>
#include <stdlib.h>
#include "./01_linkqueue.h"
/*
* function: 创建链表
* @param [ in]
* @param [out]
* @return
*/
QueueFR* create_linkqueue()
{
QueueFR* qfr=(QueueFR*)malloc(sizeof(QueueFR));
qfr->front=(LinkQueue*)malloc(sizeof(LinkQueue));
if(qfr->front==NULL)
{
printf("链式队列创建失败");
return NULL;
}
qfr->front->msg.len=0;
qfr->front->next=NULL;
qfr->rear=qfr->front;
return qfr;
}
/*
* function: 尾插入队
* @param [ in]
* @param [out]
* @return
*/
void insert_linkqueue(QueueFR* qfr,datatype num)
{
LinkQueue* temp=(LinkQueue*)malloc(sizeof(LinkQueue));
if(temp==NULL)
{
printf("结点创建失败");
return;
}
temp->msg.data=num;
temp->next=NULL;
temp->next=qfr->rear->next;
qfr->rear->next=temp;
qfr->rear=temp;
qfr->front->msg.len++;
return;
}
/*
* function: 判空
* @param [ in]
* @param [out]
* @return
*/
int isEmpty_linkqueue(QueueFR* qfr)
{
return qfr->front==qfr->rear?1:0;
}
/*
* function: 遍历
* @param [ in]
* @param [out]
* @return
*/
void show_linkqueue(QueueFR* qfr)
{
if(isEmpty_linkqueue(qfr))
{
printf("链式队列为空");
return;
}
LinkQueue* p=qfr->front;
while(p->next!=NULL)
{
p=p->next;
printf("%d ",p->msg.data);
}
putchar(10);
return;
}
/*
* function: 头删,出队
* @param [ in]
* @param [out]
* @return
*/
datatype output_linkqueue(QueueFR* qfr)
{
if(isEmpty_linkqueue(qfr))
{
printf("链式队列为空,错误");
return (datatype)-1;
}
LinkQueue* temp=qfr->front->next;
qfr->front->next=temp->next;
datatype n=temp->msg.data;
free(temp);
if(qfr->front->next==NULL)
{
qfr->rear=qfr->front;
}
qfr->front->msg.len--;
return n;
}
头文件
#ifndef __LINK_QUEUE_H__
#define __LINK_QUEUE_H__
typedef int datatype;
typedef struct lnk
{
union{
int len;
datatype data;
}msg;
struct lnk* next;
}LinkQueue;
typedef struct{
LinkQueue* front;
LinkQueue* rear;
}QueueFR;
//创建链式队列
QueueFR* create_linkqueue();
//入队
void insert_linkqueue(QueueFR* qfr,datatype num);
//遍历
void show_linkqueue(QueueFR* qfr);
//头删,出队
datatype output_linkqueue(QueueFR* qfr);
#endif
运行结果:
