数据结构day06(单向循环链表、双向链表)

这篇具有很好参考价值的文章主要介绍了数据结构day06(单向循环链表、双向链表)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据结构day06(单向循环链表、双向链表),数据结构,链表

双向链表的练习代码

head.h

#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int database;
typedef struct double_link_list{
	union{
		database data;
		int len;
	};
	struct double_link_list* pre;
	struct double_link_list* next;

}dbLinkList,*dbLinkListp;

dbLinkListp head_create();
dbLinkListp create(database data);
int head_insert(dbLinkListp head,database data);
int tail_insert(dbLinkListp head,database data);
int output(dbLinkListp head);
int head_delete(dbLinkListp head);
int tail_delete(dbLinkListp head);
int pos_insert(dbLinkListp head,int pos,database data);
int pos_delete(dbLinkListp head,int pos);

#endif

fun.c

#include "head.h"
/*
 * function:    头结点创建
 * @param [ in] 
 * @param [out] 
 * @return      
 */
dbLinkListp head_create(){
	dbLinkListp head=(dbLinkListp)malloc(sizeof(dbLinkList));
	if(NULL==head){
		puts("malloc is NULL,failed");
		return NULL;
	}
	head->pre=NULL;
	head->next=NULL;
	head->len=0;
	return head;
}
/*
 * function:    创建节点
 * @param [ in] 
 * @param [out] 
 * @return      
 */
dbLinkListp create(database data){
	dbLinkListp new=(dbLinkListp)malloc(sizeof(dbLinkList));
	if(NULL==new){
		puts("malloc is NULL,failed");
		return NULL;
	}
	new->data=data;
	new->pre=NULL;
	new->next=NULL;
	puts("node create success");
	return new;
}
/*
 * function:    判空
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int void_point(dbLinkListp head){
	if(NULL==head){
		puts("----why give me a null head point----");
		return -1;
	}
	return 0;
}
/*
 * function:    头插
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int head_insert(dbLinkListp head,database data){
	if(void_point(head))
		return -1;
	//头插
	dbLinkListp new=create(data);
	new->next=head->next;
	if(head->next!=NULL)
		new->next->pre=new;
	head->next=new;
	new->pre=head;

	head->len++;
	puts("head insert success");
	return 0;
}
/*
 * function:    尾插
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int tail_insert(dbLinkListp head,database data){
	if(void_point(head))
		return -1;
	//尾插
	dbLinkListp p=head;
	while(p->next!=NULL)
		p=p->next;
	dbLinkListp new=create(data);

	new->next=p->next;
	new->pre=p;
	p->next=new;

	head->len++;
	puts("tail insert success.");
	return 0;
}
/*
 * function:    输出
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int output(dbLinkListp head){
	if(void_point(head))
		return -1;
	while(head->next!=NULL){
		printf("%d\t",head->next->data);
		head=head->next;
	}
	puts("output done");
	return 0;
}
/*
 * function:   头删
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int head_delete(dbLinkListp head){
	if(void_point(head))
		return -1;
	if(head->next==NULL){
		puts("there is no assignment to delete.");
		return -1;
	}
	dbLinkListp del=head->next;
	if(head->next->next!=NULL)
	head->next->next->pre=head;
	head->next=head->next->next;

	free(del);
	del=NULL;
	head->len--;
	puts("head_delete success");
	return 0;
}
/*
 * function:    尾删
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int tail_delete(dbLinkListp head){
	if(void_point(head))
		return -1;
	if(head->next==NULL){
		puts("there is no assignment to delete.");
		return -1;
	}
	dbLinkListp p=head;
	//找到倒数第一个
	while(p->next!=NULL){
		p=p->next;
	}
	p->pre->next=p->next;
	free(p);
	p=NULL;
	head->len--;
	puts("tail delete success");
	return 0;
}
/*
 * function:    指定位置插入
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int pos_insert(dbLinkListp head,int pos,database data){
	if(void_point(head))
		return -1;

	//判断位置合理性
	if(pos<1||pos>head->len+1){
		puts("your position is illegal");
		return -1;
	}
	dbLinkListp p=head;
	//找到指定位置前一位
	while(pos--!=1){
		p=p->next;
	}
	dbLinkListp new=create(data);

	if(p->next!=NULL){
		new->next=p->next->next;
		p->next->next->pre=new;
	}
	new->pre=p;
	p->next=new;

	head->len++;
	puts("pos insert success");
	return 0;
}
/*
 * function:    指定位置删除
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int pos_delete(dbLinkListp head,int pos){
	if(void_point(head))
		return -1;
	if(head->next==NULL){
		puts("there is no assignment to delete.");
		return -1;
	}
	//判断位置合理性
	if(pos<1||pos>head->len){
		puts("your position is illegal");
		return -1;
	}
	dbLinkListp p=head;
	//找到指定位置前一位
	while(pos--!=1){
		p=p->next;
	}
	printf("pos-1=%d\t",p->data);
	//删除
	dbLinkListp del=p->next;
	p->next=p->next->next;
	if(p->next!=NULL)
		p->next->pre=p;

	free(del);
	del=NULL;
	puts("pos delete success");
	return 0;
}

main.c

#include "head.h"
int main(int argc, const char *argv[])
{
	dbLinkListp head=head_create();
	head_insert(head,9);
	head_insert(head,8);
	head_insert(head,6);
	head_insert(head,5);
	tail_insert(head,7);
	output(head);
	//head_delete(head);
	//tail_delete(head);
	//pos_insert(head,6,66);
	//pos_delete(head,5);
	output(head);


	return 0;
}

今日思维导图哈

数据结构day06(单向循环链表、双向链表),数据结构,链表数据结构day06(单向循环链表、双向链表),数据结构,链表​​​​​​​文章来源地址https://www.toymoban.com/news/detail-690073.html

到了这里,关于数据结构day06(单向循环链表、双向链表)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构 - 链表详解(二)—— 带头双向循环链表

    链表的结构一共有 八种 :带头单向循环链表、带头单向非循环链表、带头双向循环链表、带头双向非循环链表、无头单向循环链表、无头单向非循环链表、无头双向循环链表、无头双向非循环链表。 今天我们来详解带头双向循环链表 带头双向循环链表是一种数据结构,它通

    2024年04月26日
    浏览(55)
  • 【数据结构初阶】三、 线性表里的链表(无头+单向+非循环链表 -- C语言实现)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】二、 线性表里的顺序表(C语言实现顺序表)-CSDN博客  =========================

    2024年02月08日
    浏览(54)
  • 【数据结构】链表:带头双向循环链表的增删查改

    本篇要分享的内容是带头双向链表,以下为本片目录 目录 一、链表的所有结构 二、带头双向链表 2.1尾部插入 2.2哨兵位的初始化 2.3头部插入 2.4 打印链表 2.5尾部删除 2.6头部删除  2.7查找结点 2.8任意位置插入 2.9任意位置删除  在刚开始接触链表的时候,我们所学仅仅所学的

    2024年02月05日
    浏览(89)
  • 【数据结构】—带头双向循环链表的实现(完美链表)

    链表结构一共有八种形式,在前面的文章里已经讲完了不带头单向非循环链表的实现,但是我们发现该链表实现尾插与尾删时比较麻烦,要先从头节点进行遍历,找到尾节点,时间复杂度为O(N),而本次所讲的带头双向循环单链表,则可以直接找到尾节点。 虽然该链表看起来

    2024年01月25日
    浏览(61)
  • 数据结构入门(C语言版)线性表中链表介绍及无头单向非循环链表接口实现

    概念 : 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素 。因此,为了表示每个数据元素与其直接后继数据元素之间的逻辑关系,对数据元素来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。这

    2023年04月09日
    浏览(48)
  • 数据结构_链表_单向循环链表的初始化、插入、删除、修改、查询打印(基于C语言实现)

    版本: 2024年4月25日 V1.0 发布于博客园 目录 目录 单向循环链表公式 初始化单向循环链表 构建单向循环链表结点 创建一个空链表(仅头结点) 创建一个新结点 插入数据 头插 中插 尾插 删除数据 头删 中删 尾删 查询打印数据 遍历打印 测试 测试结果: 完整代码 CircularLinkedLis

    2024年04月25日
    浏览(50)
  • 【数据结构和算法】实现带头双向循环链表(最复杂的链表)

    前文,我们实现了认识了链表这一结构,并实现了无头单向非循环链表,接下来我们实现另一种常用的链表结构,带头双向循环链表。如有仍不了解单向链表的,请看这一篇文章(7条消息) 【数据结构和算法】认识线性表中的链表,并实现单向链表_小王学代码的博客-CSDN博客

    2024年01月17日
    浏览(76)
  • 数据结构:链表基础OJ练习+带头双向循环链表的实现

    目录 一.leetcode剑指 Offer II 027. 回文链表 1.问题描述 2.问题分析与求解 (1) 快慢指针法定位链表的中间节点 (2) 将链表后半部分进行反转 附:递归法反转链表 (3) 双指针法判断链表是否回文 二.带头双向循环链表的实现 1.头文件 2.节点内存申请接口和链表初始化接口 3.链表的打

    2024年02月02日
    浏览(49)
  • 『初阶数据结构 • C语言』⑨ - 基于结点的数据结构——链表(单链表&&双向循环链表)附完整源码

      本章内容 1.什么是链表 2.链表常见几种形式 3.无头单向非循环链表的实现 3.1结点结构的定义 3.2函数接口的实现 3.2.1尾插 3.2.2尾删 4. 带头双向循环链表的实现 4.1结点结构的定义 4.2函数接口的实现 5.两种链表的差异 ①尾插与尾删的时间复杂度 ②头插与头删的时间复杂度 ③

    2024年02月16日
    浏览(78)
  • 链接未来:深入理解链表数据结构(二.c语言实现带头双向循环链表)

    上篇文章简述讲解了链表的基本概念并且实现了无头单向不循环链表:链接未来:深入理解链表数据结构(一.c语言实现无头单向非循环链表)-CSDN博客 那今天接着给大家带来带头双向循环链表的实现 : 头文件DoubleList.h:用来基础准备(常量定义,typedef),链表表的基本框架

    2024年01月16日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包