c语言 双向链表的基础操作

//头文件
#pragma once

typedef int DataType;

typedef struct LinkList
{
	DataType _data;
	struct LinkList* _next;
	struct LinkList* _prev;
}LinkList,*pLinkList;

void InitList(pLinkList pNode);
pLinkList _BuyNode(pLinkList& pNode,DataType x);
void PrintList(pLinkList pHead);
void PushBack(pLinkList& pHead,DataType x);
void PopBack(pLinkList& pHead);
void PushFront(pLinkList& pHead,DataType x);
void PopFront(pLinkList& pHead);
pLinkList Find(pLinkList pHead, DataType x);
void Insert(pLinkList pos,DataType x);
void Erase(pLinkList& pHead, pLinkList pos);
void Reverse(pLinkList& pHead);
void DestroyList(pLinkList& pHead);

//函数文件
#include<stdio.h>
#include<assert.h>
#include"LinkList.h"
#include<malloc.h>

//初始化
void InitList(pLinkList pNode)
{
	assert(pNode);
	if (pNode->_next == NULL)
	{
		pNode->_prev = NULL;
	}
}
//创建节点
pLinkList _BuyNode(pLinkList& pNode, DataType x)
{
	pNode = (pLinkList)malloc(sizeof(LinkList));
	pNode->_data = x;
	pNode->_next = NULL;
	pNode->_prev = NULL;
	return pNode;
}
//遍历输出链表数据域
void PrintList(pLinkList pHead)
{
	pLinkList head = pHead;
	if(pHead == NULL)
	{
		printf("链表为空!\n");
		return;
	}
	while (head)
	{
		printf("%d ",head->_data);
		head = head->_next;
	}
	printf("\n");
}
//尾插
void PushBack(pLinkList& pHead, DataType x)
{
	pLinkList head = pHead;
	if (head == NULL)
	{
		_BuyNode(pHead, x);
		return;
	}
	while (head->_next)
	{
		head = head->_next;
	}
	head->_next = _BuyNode(head->_next,x);
	head->_next->_prev = head;
}
//尾删
void PopBack(pLinkList& pHead)
{
	pLinkList head = pHead;
	pLinkList tmp = NULL;
	if (pHead == NULL)
	{
		printf("链表已空!\n");
		return;
	}
	if (head->_next == NULL)
	{
		free(head);
		pHead = NULL;
		return;
	}
	while (head->_next)
	{
		head = head->_next;
	}
	tmp = head->_prev;
	tmp->_next = NULL;
	free(head);
}
//头插
void PushFront(pLinkList& pHead, DataType x)
{
	pLinkList head = pHead;
	pLinkList tmp = pHead;
	if (pHead == NULL)
	{
		_BuyNode(pHead, x);
		return;
	}
	pHead=_BuyNode(head->_prev, x);
	pHead->_next = tmp;
}
//头删
void PopFront(pLinkList& pHead)
{
	pLinkList tmp = pHead;
	if (pHead == NULL)
	{
		printf("链表已空!\n");
		return;
	}
	pHead = pHead->_next;
	if (pHead)
	{
		pHead->_prev = NULL;
	}
	free(tmp);
}
//查找
pLinkList Find(pLinkList pHead, DataType x)
{
	pLinkList head = pHead;
	assert(pHead);
	while (head)
	{
		if (head->_data == x)
			return head;
		head = head->_next;
	}
	return NULL;
}
//中插_之后
void Insert(pLinkList pos, DataType x)
{
	pLinkList tmp = pos->_next;

	assert(pos);
    _BuyNode(pos->_next, x);
	pos->_next->_prev = pos;
	pos->_next->_next = tmp;
}
//中删
void Erase(pLinkList& pHead, pLinkList pos)
{
	pLinkList tmp = pos;
	assert(pos);
	if (pos->_next == NULL)
	{
		pos->_prev->_next = NULL;
		free(tmp);
		return;
	}
	if (pos==pHead)
	{
		pHead = pHead->_next;
		pHead->_prev = NULL;
		free(pos);
		return;
	}
	tmp->_prev->_next = tmp->_next;
	tmp->_next->_prev = tmp->_prev;
	free(pos);
}
//逆置
void Reverse(pLinkList& pHead)
{
	pLinkList head = pHead;
	pLinkList tmp = pHead;
	if (pHead == NULL&&pHead->_next == NULL)
		return;
	while (head)
	{
		tmp = head->_next;
		head->_next = head->_prev;
		head->_prev = tmp;
		if (head->_prev == NULL)
			pHead = head;
		head = tmp;
	}
}
//销毁
void DestroyList(pLinkList& pHead)
{
	while (pHead)
	{
		PopFront(pHead);
	}
}

//测试用例  主函数

#include"LinkList.h"
#include<stdio.h>

void test1()
{
	pLinkList pHead=NULL;
	//PushBack(pHead, 1);
	//PushBack(pHead, 2);
	//PushBack(pHead, 3);
 //   PushBack(pHead, 4);
	//PushBack(pHead, 5);
	//PrintList(pHead);
	//PopBack(pHead);
	//PopBack(pHead);
	//PopBack(pHead);
	//PopBack(pHead);
	//PopBack(pHead);
	//PopBack(pHead);
	PushFront(pHead, 1);
	PushFront(pHead, 2);
	PushFront(pHead, 3);
	PushFront(pHead, 4);
	PushFront(pHead, 5);
	PrintList(pHead);
	//PopFront(pHead);
	//PopFront(pHead);
	//PopFront(pHead);
	//PopFront(pHead);
	//PopFront(pHead);
	//PopFront(pHead);
	//printf("%d\n",Find(pHead, 6));
	Insert(Find(pHead, 1), 6);
	Erase(pHead,Find(pHead,2));
	PrintList(pHead);

	Reverse(pHead);
	PrintList(pHead);
	DestroyList(pHead);
    PrintList(pHead);
}

int main()
{
	test1();
	return 0;
}
时间: 2025-01-02 15:07:08

c语言 双向链表的基础操作的相关文章

双向链表的基础操作(C++实现)

★C++实现双向链表的基础操作(类的实现) #include<iostream> #include<cassert> using namespace std; typedef int DataType; class double_link_list {                        //定义双向链表类,包括了双向的前驱和后继指针,以及对象的初始化 public: friend class ListNode; double_link_list(DataType x =

c语言 双向链表的简单操作-创建、插入、删除

数据结构-双向链表的创建.插入和删除 双向链表是数据结构中重要的结构,也是线性结构中常用的数据结构,双向指针,方便用户从首结点开始沿指针链向后依次遍历每一个结点,结点的前驱和后继查找方便. #include <stdio.h> #include <stdlib.h> //双向链表结点的定义 typedef struct dbnode { int data; struct dbnode *prio, *next; }DbNode, linkdblist; //创建双向链表 DbNod

C语言通用双向循环链表操作函数集

说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低.     可基于该函数集方便地构造栈或队列集.     本函数集暂未考虑并发保护. 一  概念 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序通过链表中的指针链接次序实现.链表由一系列存储结点组成,结点可在运行时动态生成.每个结点均由两部分组成,即存储数据元素的数据域和存储相邻结点地址的指针域.当进行插入或删除操作时,链表只需修改相关结点的指针域即可,因此相比线性

20_Shell语言———VIM编辑器基础知识三之窗口属性定制、配置文件及查找替换功能

Vim编辑器可以让用户按照需求来定制一些使用属性. 一.窗口属性定义 1)显示行号 行号不是内容,只是用来帮助用户确认文本所在的行.在vim编辑器中,如果要显示行号,可以在末行模式下输入: set number 如果想关闭,则可以在功能名称前面加上no,即: set nonumber 命令可以被简写,如set number 可以简写为 set nu:set nonumber 可以简写为 set nonu. 注意,上述设定仅对当前vim的进程有效,一旦当前进程关闭,这些设定就会失效,如果要使设定永

[Android] SQLite数据库之增删改查基础操作

    在编程中常常会遇到数据库的操作,而Android系统内置了SQLite,它是一款轻型数据库,遵守事务ACID的关系型数据库管理系统,它占用的资源非常低,可以支持Windows/Linux/Unix等主流操作系统,同一时候可以跟非常多程序语言如C#.PHP.Java等相结合.以下先回想SQL的基本语句,再讲述Android的基本操作. 一. adb shell回想SQL语句     首先,我感觉自己整个大学印象最深的几门课就包含<数据库>,所以想先回想SQL增删改查的基本语句.而在And

前端学数据库之基础操作

前面的话 SQL是一门用于访问和处理数据库的ANSI的标准计算机语言.但是,存在着很多不同版本的SQL语言,为了与ANSI(美国国家标准学会)标准相兼容,它们必须以相似的方式共同地来支持一些主要的关键词(如 SELECT.UPDATE.DELETE.INSERT.WHERE等) RDBMS指的是关系型数据库管理系统,RDBMS是SQL的基础,同样也是所有现代数据库系统的基础,比如Oracle.MySQL和Access.RDBMS中的数据存储在被称为表(tables)的数据库对象中.表是相关的数据

mysql基础操作、sql技巧和sql的常见优化

一.常见操作 1.复制表结构create table t2 like t1 复制表数据insert into t2 select * from t1 2.mysql索引 alter table用来创建普通索引.unique索引或primary key索引 alter table t add index index_name(column_list) alter table t add unique(column_list) alter table t add primary key(column

awk程序设计语言之-awk基础

awk程序设计语言之-awk基础 1 http://man.linuxde.net/ 2 7 8 常用工具命令之awk命令 9 awk是一种编程语言,用于在Linux/Unix下对文本和数据处理.数据可以来自标准输入(stdin).一个或多个文件,或其他命令的输出.它支持用户自定义函数和动态正则表达式 10 等先进功能,是Linux/unix下的一个强大编程工具.它在命令行中使用,但更多是作为脚本来使用,awk有很多内建功能,比如数组.函数等,这是它和c语言的相同之处,灵活性 11 是awk最大

HDFS简介及用C语言访问HDFS接口操作实践

一.概述 近年来,大数据技术如火如荼,如何存储海量数据也成了当今的热点和难点问题,而HDFS分布式文件系统作为Hadoop项目的分布式存储基础,也为HBASE提供数据持久化功能,它在大数据项目中有非常广泛的应用. Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.HDFS是Hadoop项目的核心子项目,是一种具有高容错性.高可靠性.高可扩展性.高吞吐量等特征的分