数据结构之链表

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

思维导图

数据结构之链表,数据结构

练习

头文件

#ifndef __HEAD_H__
#define __HEAD_H__



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
enum
{
	FALSE=-1,
	SUCCESS
};
typedef int datatype;
//定义节点结构体
//节点:数据域 指针域

typedef struct Node
{
	//数据域:存储数据元素
	datatype data;
	//指针域:存储指针
	struct Node *next;	
}*Linklist;


Linklist creat();
Linklist insert_head(Linklist head,datatype element);
void output(Linklist head);
Linklist insert_rear(Linklist head,datatype element);
Linklist delete_head(Linklist head);
Linklist delete_rear(Linklist head);
Linklist insert_pos(Linklist head,int pos,datatype element);
Linklist delete_pos(Linklist head,int pos);
Linklist change_pos(Linklist head,int pos,datatype element);
void search_pos(Linklist head,int pos);
int search_element(Linklist head,datatype element);
Linklist rev(Linklist head);
int search_transpos(Linklist head,int pos);
Linklist chang_element(Linklist head,datatype key,datatype element);
Linklist delete_element(Linklist head,datatype key);
void Bubble(Linklist head);
void Select(Linklist head);
Linklist free_space(Linklist head);



#endif

自定义函数

#include "head.h"
/*
 * function:    创建新节点
 * @param [ in] 
 * @param [out] 
 * @return      
 */
Linklist creat()
{
	Linklist s=(Linklist)malloc(sizeof(struct Node));
	if(NULL==s)
		return NULL;
	//成功则初始化
	s->data=0;
	s->next=NULL;
	return s;
}
/*
 * function:    头插入
 * @param [ in] 
 * @param [out] 
 * @return    
 *       如果形参头指针发生指向的改变,则必须返回
 */
Linklist insert_head(Linklist head,datatype element)
{
	//创建新节点s
	Linklist s=creat();
	s->data=element;
	//判断链表是否为空
	if(head==NULL)
	{
		head=s;
	}
	else
	{
		s->next=head;
		head=s;
	}
	return head;
}



/*
 * function:    遍历输出
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void output(Linklist head)
{
	if(NULL==head)
		return;
	Linklist p=head;
	while(p!=NULL)//也可以是while(p)
	{
		printf("%-5d",p->data);
		p=p->next;
	}
	puts("");
}

/*
 * function:    尾插入
 * @param [ in] 
 * @param [out] 
 * @return      
 */

Linklist insert_rear(Linklist head,datatype element)
{
	Linklist s=creat();
	s->data=element;
	Linklist p=head;
	if(NULL==head)
		head=s;
	else
	{
		while(p->next!=NULL)
		{
			p=p->next;
		}
		p->next=s;
	}
	return head;
}
/*
 * function:   头删
 * @param [ in] 
 * @param [out] 
 * @return      
 */
Linklist delete_head(Linklist head)
{
	if(head==NULL)
		return NULL;
	else
	{
		Linklist del=head;
		head=head->next;
		free(del);	
		del=NULL;
	}
	return head;
}
/*
 * function:    尾删
 * @param [ in] 
 * @param [out] 
 * @return      
 */
Linklist delete_rear(Linklist head)
{
	if(head==NULL)
		return NULL;
	else if(head->next==NULL)
	{
		free(head);
		head==NULL;
		return head;
	}
	else
	{
		Linklist del=head;
		while(del->next->next!=NULL)
		{
			del=del->next;
		}
		free(del->next);
		del->next=NULL;
	}
	return head;
}
/*
 * function:    计算链表长度
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int length(Linklist head)
{
	int len=0;
	while(head!=NULL)
	{
		head=head->next;
		len++;
	}
	return len;
}


/*
 * function:    按任意位置插入
 * @param [ in] 
 * @param [out] 
 * @return      
 */
Linklist insert_pos(Linklist head,int pos,datatype element)
{
	if(pos<0||pos>length(head)+1)
		return head;
	Linklist s=creat();
	s->data=element;
	if(pos==1)
	{
		head=insert_head(head,element);
		return head;
	}
	Linklist p=head;
	for(int i=1;i<pos-1;i++)	
	{
		p=p->next;	
	}		
	s->next=p->next;	
	p->next=s;	
	return head;
}
/*
 * function:    按任意位置删除
 * @param [ in] 
 * @param [out] 
 * @return      
 */
Linklist delete_pos(Linklist head,int pos)
{
	if(pos<0||pos>length(head)+1)
		return head;
	if(pos==1)
	{
		head=delete_head(head);
		return head;
	}
	Linklist p=head;
	for(int i=1;i<pos-1;i++)	
	{
		p=p->next;	
	}		
	Linklist s=p->next;	
	p->next=s->next;
	free(s);
	s=NULL;
	return head;
}
/*
 * function:    按任意位置修改
 * @param [ in] 
 * @param [out] 
 * @return      
 */
Linklist change_pos(Linklist head,int pos,datatype element)
{
	if(pos<0||pos>length(head)+1)
		return head;
	if(pos==1)
	{
		head->data=element;
		return head;
	}
	Linklist p=head;
	for(int i=1;i<pos;i++)	
	{
		p=p->next;	
	}		
	p->data=element;
	return head;
}
/*
 * function:    按任意位置查找
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void search_pos(Linklist head,int pos)
{	
	if(pos<0||pos>length(head))
		return;
	if(head==NULL)
		return;
	Linklist p=head;
	for(int i=1;i<pos;i++)
	{
		p=p->next;
	}
	printf("%d\n",p->data);
}


/*
 * function:    按任意元素查找
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int  search_element(Linklist head,datatype element)
{
	if(head==NULL)
		return FALSE;
	Linklist p=head;
	int pos=0;
	while(p)
	{
		pos++;
		if(p->data==element)
		{
			return pos;
		}
		p=p->next;
	}
	if(pos==0)
		return FALSE;
}
/*
 * function:    逆置链表
 * @param [ in] 
 * @param [out] 
 * @return      
 */
Linklist rev(Linklist head)
{
	if(head==NULL)
		return head;
	Linklist p=head->next;
	head->next=NULL;
	Linklist t=p;
	while(p)
	{
		t=p;
		p=p->next;
		t->next=head;
		head=t;
	}
	return head;
}


/*
 * function:    查找倒数第n个值
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int search_transpos(Linklist head,int pos)
{
	if(head==NULL)
		return FALSE;
	if(pos<0||pos>length(head))
		return FALSE;
	Linklist p=head;
	Linklist q=head;
	for(int i=0;i<pos;i++)
	{
		p=p->next;
	}
	while(p)
	{
		p=p->next;
		q=q->next;
	}
	return q->data;
}
/*
 * function:    按任意元素修改
 * @param [ in] 
 * @param [out] 
 * @return      
 */
Linklist chang_element(Linklist head,datatype key,datatype element)
{
	if(head==NULL)
		return NULL;
	int pos=search_element(head,key);
	head=change_pos(head,pos,element);
	return head;
}

/*
 * function:    按任意元素删除
 * @param [ in] 
 * @param [out] 
 * @return      
 */
Linklist delete_element(Linklist head,datatype key)
{
	if(head==NULL)
		return NULL;
	int pos=search_element(head,key);
	head=delete_pos(head,pos);
	return head;
}
/*
 * function:    冒泡排序(从小到大)
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void Bubble(Linklist head)
{
	if(head==NULL)
		return;

	for(int i=0;i<length(head)-1;i++)
	{
		Linklist p=head;
		for(int j=0;j<length(head)-i-1;j++)
		{
			if(p->data >p->next->data)
			{
				datatype temp=p->data;
				p->data=p->next->data;
				p->next->data=temp;
			}
			p=p->next;
		}
	}
}

/*
 * function:    简单选择排序(从大到小)
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void Select(Linklist head)
{
	if(head==NULL)
		return;
	Linklist p=head;
	for(int i=0;i<length(head)-1;i++)
	{
		datatype max=p->data;
		Linklist q=p->next;
		for(int j=i+1;j<length(head);j++)
		{
			if(p->data<q->data)
			{
				max=q->data;
			}
			q=q->next;
		}
		chang_element(head,max,p->data);
		p->data=max;
		p=p->next;
	}
}
/*
 * function:    释放空间
 * @param [ in] 
 * @param [out] 
 * @return      
 */
Linklist free_space(Linklist head)
{
	if(head==NULL)
		return NULL;
	for(int i=0;i<length(head);i++)
	{
		Linklist s=head;
		head=head->next;
		free(s);
		s=NULL;
	}
	return head;
}

主函数

#include "head.h"
int main(int argc, const char *argv[])
{
	//定义单链表的头指针
	Linklist head=NULL;
	int n;
	//插入的值
	datatype element;
	
	printf("请输入链表长度\n");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		printf("请输入第%d个值:",i+1);
		scanf("%d",&element);
		//head=insert_head(head,element);
		head=insert_rear(head,element);
	}
//	head=delete_head(head);
//	head=delete_rear(head);
// 按位置插入
	int pos;
/*
	printf("请输入要插入的位置");
	scanf("%d",&pos);
	printf("请输入要插入的值");
	scanf("%d",&element);
	head=insert_pos(head,pos,element);
	output(head);
	printf("请输入要删除的位置");
	scanf("%d",&pos);
	head=delete_pos(head,pos);
	output(head);
*/
/*
	printf("请输入要修改的位置");
	scanf("%d",&pos);
	printf("请输入要修改后的值");
	scanf("%d",&element);
	head=change_pos(head,pos,element);
	output(head);
	printf("请输入要查找的位置");
	scanf("%d",&pos);
	search_pos(head,pos);
*/
	printf("请输入要查找的值");
	scanf("%d",&element);
	pos=search_element(head,element);
	printf("%d\n",pos);
//	head=rev(head);
	output(head);

/*	printf("请输入要查找倒数第几个");
	scanf("%d",&pos);
	int num=search_transpos(head,pos);
	printf("倒数第%d个的值为:%d\n",pos,num);
*/
	int key;

	printf("请输入要修改的值");
	scanf("%d",&key);
	printf("请输入修改后的值");
	scanf("%d",&element);
	head=chang_element(head,key,element);
	output(head);
	printf("请输入要删除的值");
	scanf("%d",&element);
	head=delete_element(head,element);
	output(head);

	Bubble(head);
	output(head);
	Select(head);
	output(head);
	free_space(head);
	return 0;
}

效果图

 数据结构之链表,数据结构文章来源地址https://www.toymoban.com/news/detail-822479.html

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

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

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

相关文章

  • C语言数据结构之链表

    在上一篇博客中我们提到,线性表包括顺序表和链表,顺序表在上篇博客中已经介绍,本篇博客介绍一下另一种线性表—— 链表 。 概念:链表是⼀种 物理存储结构上⾮连续、⾮顺序 的存储结构,数据元素的 逻辑顺序是通过链表中的指针链接次序实现的 。 链表的结构跟⽕

    2024年04月22日
    浏览(44)
  • C语言进阶——数据结构之链表(续)

    hello,大家好呀,我是Humble,本篇博客承接之前的 C语言进阶——数据结构之链表 的内容 (没看过的小伙伴可以从我创建的专栏C语言进阶之数据结构 找到那篇文章并阅读后在回来哦~) ,上次我们重点说了链表中的 单链表 ,即 不带头单向不循环链表 还说到了链表的分类虽

    2024年01月25日
    浏览(59)
  • 数据结构之链表练习与习题详细解析

    个人主页:点我进入主页 专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶 C语言刷题       数据结构初阶 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.前言 2.习题解析 2.1习题一 2.2习题二 2.3习题三 2.4习题四 2.

    2024年02月05日
    浏览(45)
  • 【023】C/C++数据结构之链表及其实战应用

    💡 作者简介:专注于C/C++高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。包括C/C++、Linux、MySQL、Redis、TCP/IP、协程、网络编程等。 👉 🎖️ CSDN实力新星,社区专家博主 👉 🔔 专栏介绍:从零到c++精通的学习之路。内容包括C++基础编程、中级编程、

    2024年02月08日
    浏览(56)
  • C/C++数据结构之链表题目答案与解析

    个人主页:点我进入主页 专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶 C语言刷题       数据结构初阶 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.前言  2.题目解析 2.1 移除链表元素 2.2反转链表 2.3链表的中

    2024年02月05日
    浏览(60)
  • 数据结构之链表 - 超详细的教程,手把手教你认识并运用链表

    顺序表只适合静态的查找和更新,不适合插入和删除元素, 因为在ArrayList中插入和删除元素时,由于需要将后序元素往前后者往后移动,所以时间复杂度会相当高,能达到O(N)。 为了解决这一问题,java 引入了 LinkedList(链表)。 链表是一种 逻辑上连续,物理上不连续 的存储结

    2024年02月09日
    浏览(64)
  • 数据结构-链表结构-双向链表

    双向链表也叫双链表,与单向链表不同的是,每一个节点有三个区域组成:两个指针域,一个数据域 前一个指针域:存储前驱节点的内存地址 后一个指针域:存储后继节点的内存地址 数据域:存储节点数据 以下就是双向链表的最基本单位 节点的前指针域指向前驱,后指针

    2024年02月04日
    浏览(47)
  • <数据结构> 链表 - 链表的概念及结构

    概念: 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的 逻辑顺序 是通过链表中的 指针链接 次序实现的 1、链表由一系列结点(链表中每一个元素称为结点)组成。 2、结点可以在运行时动态(malloc)生成。 3、每个结点包括两个部分:一个是存储数据元素的

    2023年04月09日
    浏览(46)
  • 【数据结构-链表-01】反转链表

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月10日
    浏览(44)
  • 数据结构——线性数据结构(数组,链表,栈,队列)

    数组(Array) 是一种很常见的数据结构。它由相同类型的元素(element)组成,并且是使用一块连续的内存来存储。 我们直接可以利用元素的索引(index)可以计算出该元素对应的存储地址。 数组的特点是: 提供随机访问 并且容量有限。 2.1. 链表简介 链表(LinkedList) 虽然是

    2024年02月11日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包