双向链表,顺序栈,顺序队列,链式队列

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
运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值