数据结构day05(单链表)

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

今日任务:

数据结构day05(单链表),数据结构

 思维导图:

数据结构day05(单链表),数据结构

实现 代码:(多文件)

head.h

#ifndef __HEAD_H__
#define __HEAD_H__

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef int datatype;

typedef struct Linklist
{
	union {
		int len;
		datatype data;
	};
	struct Linklist* next;
}Node,*NodeP;
NodeP head_create();
NodeP create();
int output(NodeP head);
int tail_insert(NodeP head,datatype data);
int head_insert(NodeP head,datatype data);
int tail_delete(NodeP head);
int head_delete(NodeP head);
int pos_insert(NodeP head,datatype data,int pos);
int pos_delete(NodeP head,int pos);
int pos_update(NodeP head,datatype data,int pos);
int value_index(NodeP head,datatype data);
int value_delete(NodeP head,datatype data);
int inversion(NodeP head);
int free_linklist(NodeP head);
#endif

fun.c

#include "head.h"
/*
 * function:   传参 空指针判定
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int void_point(NodeP p){
	if(NULL==p){
		puts("how dare you give me null point.");
		return -1;
	}
	return 0;
}
/*
 * function:    头结点创建
 * @param [ in] 
 * @param [out] 
 * @return      
 */
NodeP head_create(){
	NodeP head=(NodeP)malloc(sizeof(Node));
	if(head==NULL){
		puts("how dare you give me null place.");
		return NULL;
	}
	head->len=0;
	head->next=NULL;
	return head;
}
/*
 * function:    节点创建
 * @param [ in] 
 * @param [out] 
 * @return      
 */
NodeP create(datatype data){
	NodeP new=(NodeP)malloc(sizeof(Node));
	if(new==NULL){
		puts("how dare you give me null place.");
		return NULL;
	}
	new->data=data;
	new->next=NULL;
	return new;
}
/*
 * function:    输出
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int output(NodeP head){
	if(void_point(head))
		return -1;
	while(head->next!=NULL){
		printf("%d\t",head->next->data);
		head=head->next;
	}
	puts("output done.");
}
/*
 * function:    节点尾插
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int tail_insert(NodeP head,datatype data){
	if(void_point(head))
		return -1;
	//找到尾部节点
	NodeP p=head;
	while(p->next!=NULL)
		p=p->next;
	p->next=create(data);
	head->len++;
	puts("tail insert success.");
	return 0;
}
/*
 * function:    节点头插
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int head_insert(NodeP head,datatype data){
	if(void_point(head))
		return -1;
	NodeP new=create(data);
	new->next=head->next;
	head->next=new;
	head->len++;
	puts("head insert success");
}
/*
 * function:    尾删
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int tail_delete(NodeP head){
	if(void_point(head))
		return -1;
	if(head->next==NULL){
		puts("there is no assigment to delete.");
		return -1;
	}
	//找到最后一个节点,free并len--,前一节点指向null
	NodeP p=head;
	while(p->next->next!=NULL)
		p=p->next;
	free(p->next);
	p->next=NULL;
	head->len--;
	puts("tail delete success");
	return 0;
}
/*
 * function:    头删
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int head_delete(NodeP head){
	if(void_point(head))
		return -1;
	if(head->next==NULL){
		puts("there is no assigment to delete.");
		return -1;
	}
	NodeP p=head->next;
	free(head->next);
	head->next=p->next;
	p=NULL;
	head->len--;
	puts("head delete success");
	return 0;
}
/*
 * function:    指定位置添加
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int pos_insert(NodeP head,datatype data,int pos){

	if(void_point(head))
		return -1;
	if(pos>head->len+1||pos<1){
		puts("your position is illegal.");
		return -1;
	}
	NodeP p=head;
	while(pos--!=1)
		p=p->next;
	NodeP new=create(data);
	new->next=p->next;
	p->next=new;
	head->len++;
	puts("pos insert success");
}
/*
 * function:    指定位置删除
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int pos_delete(NodeP head,int pos){
	if(void_point(head))
		return -1;
	if(pos<1||pos>head->len){
		puts("your position is illegal.");
		return -1;
	}
	NodeP p=head;
	while(pos--!=1)
		p=p->next;
	NodeP x=p->next;
	p->next=p->next->next;
	free(x);
	x=NULL;
	head->len--;
	puts("pos delete success");
	return 0;
}
/*
 * function:    指定位置修改
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int pos_update(NodeP head,datatype data,int pos){
	if(void_point(head))
		return -1;
	if(pos<1||pos>head->len){
		puts("your position is illegal.");
		return -1;
	}
	NodeP p=head;
	while(pos--)
		p=p->next;
	p->data=data;
	puts("pos update success");
	return 0;
}
/*
 * function:    按值查找下表
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int value_index(NodeP head,datatype data){
	if(void_point(head))
		return -1;
	if(head->len==0){
		puts("linklist is null");
		return -1;
	}
	int index=0;
	NodeP p=head;
	while(p->next!=NULL){
		p=p->next;
		index++;
		if(p->data==data){
			printf("the index your want to find is%d\n",index);
			return index;
		}
	}
	puts("can't find your value");
	return 0;
}
/*
 * function:    按值删除
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int value_delete(NodeP head,datatype data){
	if(void_point(head))
		return -1;
	if(head->len==0){
		puts("linklist is null");
		return -1;
	}
	NodeP p=head;
	while(p->next!=NULL){
		if(p->next->data==data){
			pos_delete(head,value_index(head,data));
			puts("value delete success");
			return 0;
		}
		p=p->next;
	}
	puts("no value your want to delete");
}
/*
 * function:    循环逆置
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int inversion(NodeP head){
	if(void_point(head))
		return -1;
	if(head->len==0){
		puts("linklist is NULL");
		return -1;
	}
	if(head->len==1){
		puts("there is no deed");
		return 0;
	}
	//逆置
	//将第二个节点作为尾节点,但是得先记录一下,还得用于每次循环的头插的第一个元素
	NodeP p=head->next->next;
	head->next->next=NULL;
	//定义一个节点,用于方便循环调用后面的元素头插,
	NodeP k=p;
	puts("debug..");
	output(p);
	while(p!=NULL){
		p=p->next;

		k->next=head->next;
		head->next=k;

		k=p;
	}
	puts("inversion success.");
	return 0;
}
/*
 * function:    释放链表
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int free_linklist(NodeP head){
	if(void_point(head))
		return -1;
	NodeP p=NULL;
	while(head!=NULL){
		p=head;
		head=head->next;
		free(p);
		p=NULL;
	}
	puts("free success.");
	return 0;
}

main.c

#include "head.h"
int main(int argc, const char *argv[])
{
	NodeP p=head_create();
	tail_insert(p,10);
	tail_insert(p,20);
	tail_insert(p,30);
	tail_insert(p,40);
	tail_insert(p,50);
	head_insert(p,99);
	head_insert(p,88);
	output(p);
	//pos_insert(p,66,0);
	//output(p);
	//pos_delete(p,8);
	//output(p);
	//pos_update(p,66,8);
	//output(p);
	//tail_delete(p);
	//output(p);
	//head_delete(p);
	//output(p);
	//value_delete(p,77);
	//output(p);
	//inversion(p);
	//output(p);
	free_linklist(p);
	p=NULL;
	return 0;
}

不好,眼花了,没看到实现单项循环链表,ji文章来源地址https://www.toymoban.com/news/detail-682377.html

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

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

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

相关文章

  • 数据结构 - 单链表

    目录 文章目录 一、什么是链表? 线性表: 顺序表: 二、链表的分类和实现 分类: 实现: 1.创建节点类 2.创建单链表  1.addTail(尾增)   2.删除节点值为key的第一个节点  3.插入节点(在指定位置) 4.获取链表长度  总结 前言 大家好,这篇博客给大家讲一下什么是链表以及单链表的实现

    2024年02月09日
    浏览(29)
  • 【数据结构】单链表(一)

    作者:日出等日落 专栏:数据结构 想变成仲夏夜的一只萤火虫,只要抓住你的注意力,就已经满足了。 目录 前言:  单链表的结构 :  逻辑结构: 物理结构: BuySLTNode(动态申请一个结点):   CreateSList(//循环创建结点): SLTPrint(单链表打印):  单链表的功能:  SL

    2024年02月01日
    浏览(30)
  • 数据结构——单链表

    我们需要在程序中存储一系列的数据,这些数据不是一成不变的,需要满足随时的动态增删查改。 顺序表,虽然能满足这些要求,可是顺序表在头插或者中间插入数据时,需要将数据一个一个挪动,效率较低;而且需要频繁的扩容,扩容也是需要付出一定的代价。 为有效解

    2023年04月17日
    浏览(44)
  • 数据结构入门——单链表

    目录 前言 链表的定义 链表的创建 头插法创建链表 尾插法创建链表 链表的删除 在头部删除元素 在尾部删除元素 查找固定元素 在链表中插入元素 在pos位置前插入 在pos位置后插入 删除链表结点 删除pos位置的结点 删除pos后的结点 链表的销毁 写在最后 前面我们学习了顺序表

    2024年02月20日
    浏览(29)
  • 数据结构·单链表

            不可否认的是,前几节我们讲解的顺序表存在一下几点问题:         1. 中间、头部的插入和删除,需要移动一整串数据,时间复杂度O(N)         2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗         3. 增容一般是2倍的增长,这势

    2024年01月25日
    浏览(64)
  • 数据结构—单链表

    目录 1.前言 2.了解单链表 3.单链表代码实现       3.1 单链表结构体实现       3.2 创建节点       3.3  打印单链表       3.4 尾插        3.5  头插        3. 6 头删       3.7  尾删       3.8  查找       3.9  插入            3.9.1 在pos位置之前插入             3.9.

    2023年04月20日
    浏览(93)
  • 【数据结构】单链表(超全)

    前言:  上一次我们分享了线性表中的一种结构顺序表,它存在着一些其缺点,比如:在中间位置或者头部进行元素插入或者删除的时候时间复杂度是 O ( N ) O(N) O ( N ) 效率比较低,并且顺序表在扩容的时候也存在时间和空间上的消耗,由于我们每次都是按照二倍来扩的,那

    2024年02月11日
    浏览(30)
  • 【数据结构】单链表(详解)

    所属专栏:初始数据结构 博主首页:初阳785 代码托管:chuyang785 感谢大家的支持,您的点赞和关注是对我最大的支持!!! 博主也会更加的努力,创作出更优质的博文!! 关注我,关注我,关注我,重要的事情说三遍!!!!!!!! 前面我们已经用顺序表方式来实现接口

    2023年04月24日
    浏览(43)
  • 数据结构-单链表

    概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。  从以上图片可以看出: 1.链式结构在逻辑上是连续的,但在物理上不一定是连续的。 2.现实中的节点一般是在堆上申请出来的。 3.从堆上申请的空间,

    2024年02月05日
    浏览(30)
  • 【数据结构】单链表详解

    当我们学完顺序表的时候,我们发现了好多问题如下: 中间/头部的插入删除,时间复杂度为O(N) 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们 再继续插入了

    2024年02月09日
    浏览(22)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包