C语言实现单链表

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


前言

           近期学习了单链表的知识,对于书本上那些图画表示链表确实生动,但我也还是不怎么明白具体是如何操作,但研究书本上的代码加上各种资料的搜索,让我写下了单链表的操作代码。

           希望这篇博客对您有帮助和参考价值。同时也是为了记录一下自己的编程学习之路吧。新CSDBNER,不当之处,还望指正。


单链表的基本操作

     单链表的基本操作包括单链表的初始化、建立、插入、查找、修改、打印、表长的输出等等运算。其中比较重要的是按值查找元素、查找某位置并插入元素、修改某位置的元素以及尾插法建表。目前该表是只实现了这些操作,并进行的测试。

1.头文件准备(定义指针,数据)

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

typedef struct Node
{
	int data;
	struct Node* next;
}Node,*LinkList;

2.用尾插法建立单链表

LinkList CreateFormTail(LinkList L)
{
	L=(Node*)malloc(sizeof(Node));
	L->next=NULL;
	
	Node *r,*s;
	int x;
	scanf("%d",&x);
	r=L;
	while(x!=9999)
	{
			s=(Node*)malloc(sizeof(Node));
			s->data=x;
			r->next=s;
			r=s;
			scanf("%d",&x);
	}
	r->next=NULL;
	return L;
 }

3.在单链表中查找值为e的元素 

int Locate(LinkList L,int e) 
{
	Node *p;
	p=L->next;
	int i=1;
	while(p!=NULL&&p->data!=e)
	{
		p=p->next;
		i++;
	}
	if(p==NULL)
	    return 0;
	else
	    return i;
}

4.在链表中第i个位置插入值为e的元素

bool InsList(LinkList L,int i,int e)
{
	Node *pre,*s;
	int k=0;
	if(i<=0) return false;
	pre=L;
	while(pre!=NULL&&k<i-1)
	{
		pre=pre->next;
		k=k+1;
	}
	if(pre==NULL)
	    return false;
	s=(Node*)malloc(sizeof(Node));
	s->data=e;
	s->next=pre->next;
	pre->next=s;
	return true;
 }
 

6.删除第i个元素

bool DelList(LinkList L,int i,int e)
{
	Node *pre,*r;
	int k=0;
	pre=L;
	while(pre->next!=NULL&&k<i-1)
	{
		pre=pre->next;
		k=k+1;
	}
	if(pre->next==NULL)
	    return false;
	r=pre->next;
	pre->next=r->next;
	e=r->data;
	free(r);
	return true;
}

7.修改链表中第i个元素的数值

int ChangeList(LinkList L,int i,int e)
{
	Node *pr;
	pr=L;
	while(pr!=NULL)
	if(pr->data==i)
	{
		pr->data=e;
		break;
	}
	else
	{
		pr=pr->next;
	}
	if(pr==NULL) return false;
	return true;
 } 

8.求单链表的长度

int ListLength(LinkList L)
{
	Node *p;
	p=L->next;
	int j=0;
	while(p!=NULL)
	{
		p=p->next;
		j++;
	 }
	 return j;
 } 

9.打印输出单链表

void PrintList(LinkList L)
{
	L=L->next;
	while(L)
	{
		printf("%3d",L->data);
		L=L->next;
	 }
	 printf("\n");
 } 

10.主函数

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

typedef struct Node
{
	int data;
	struct Node* next;
}Node,*LinkList;


//用尾插法建立单链表
LinkList CreateFormTail(LinkList L)
{
	L=(Node*)malloc(sizeof(Node));
	L->next=NULL;
	
	Node *r,*s;
	int x;
	scanf("%d",&x);
	r=L;
	while(x!=9999)
	{
			s=(Node*)malloc(sizeof(Node));
			s->data=x;
			r->next=s;
			r=s;
			scanf("%d",&x);
	}
	r->next=NULL;
	return L;
 }


//在单链表中查找值为e的元素 
int Locate(LinkList L,int e) 
{
	Node *p;
	p=L->next;
	int i=1;
	while(p!=NULL&&p->data!=e)
	{
		p=p->next;
		i++;
	}
	if(p==NULL)
	    return 0;
	else
	    return i;
}

//在链表中第i个位置插入值为e的元素
bool InsList(LinkList L,int i,int e)
{
	Node *pre,*s;
	int k=0;
	if(i<=0) return false;
	pre=L;
	while(pre!=NULL&&k<i-1)
	{
		pre=pre->next;
		k=k+1;
	}
	if(pre==NULL)
	    return false;
	s=(Node*)malloc(sizeof(Node));
	s->data=e;
	s->next=pre->next;
	pre->next=s;
	return true;
 }
 
//删除第i个元素
bool DelList(LinkList L,int i,int e)
{
	Node *pre,*r;
	int k=0;
	pre=L;
	while(pre->next!=NULL&&k<i-1)
	{
		pre=pre->next;
		k=k+1;
	}
	if(pre->next==NULL)
	    return false;
	r=pre->next;
	pre->next=r->next;
	e=r->data;
	free(r);
	return true;
}

//修改链表中第i个元素的数值
int ChangeList(LinkList L,int i,int e)
{
	Node *pr;
	pr=L;
	while(pr!=NULL)
	if(pr->data==i)
	{
		pr->data=e;
		break;
	}
	else
	{
		pr=pr->next;
	}
	if(pr==NULL) return false;
	return true;
 } 

//求单链表的长度
int ListLength(LinkList L)
{
	Node *p;
	p=L->next;
	int j=0;
	while(p!=NULL)
	{
		p=p->next;
		j++;
	 }
	 return j;
 } 

//打印输出单链表
void PrintList(LinkList L)
{
	L=L->next;
	while(L)
	{
		printf("%3d",L->data);
		L=L->next;
	 }
	 printf("\n");
 } 

int main()
{
	LinkList list;
	int i,j,k,e;
	printf("请输入链表中的数值:"); 
	list=CreateFormTail(list);
	printf("当前链表中的数据为:");
	PrintList(list);
	printf("表长为:%d\n",ListLength(list));
	
	printf("请输入需要查找元素e的值:") ;
	scanf("%d",&e);
	printf("%d所在的位置是:%d\n",e,Locate(list,e));
	
	printf("请输入需要插入元素的位置i和元素的值e:");
	scanf("%d%d",&i,&e);
	InsList(list,i,e);
	printf("插入元素后链表中的数据为:");
	PrintList(list);
	printf("表长为:%d\n",ListLength(list));
	
	printf("请输入需要删除元素的位置i的值:");
	scanf("%d",&i);
	DelList(list,i,e);
	printf("删除元素后链表中的数据为:");
	PrintList(list);
	printf("表长为:%d\n",ListLength(list));
	
	printf("请输入需要修改位置i的值和更改后的值e:");
	scanf("%d%d",&i,&e);
	ChangeList(list,i,e);
	printf("修改元素后链表中的数据为:");
	PrintList(list);
	printf("表长为:%d\n",ListLength(list));
	
 } 

11.运行结果

c语言编写一个简单的单链表,数据结构,数据结构,c语言,链表


总结

          该链表的功能还不够完善,后续会继续进行完善。文章来源地址https://www.toymoban.com/news/detail-727459.html

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

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

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

相关文章

  • 数据结构:单链表的实现(C语言)

    个人主页 : 水月梦镜花 个人专栏 : 《C语言》 《数据结构》 本博客将要实现的无头单向不循环链表。 我们将节点定义为如下结构: 其成员变量有data,next。 将int重命名为STLDataType,方便我们以后修改数据域的内容。 动态申明一个空间,来放置数据。如下: 将data的内容置

    2024年02月14日
    浏览(59)
  • 【数据结构】C语言实现单链表(带头结点)

    Single linked list with leading nodes 关于不带头结点的单链表:不带头结点的单链表 结点定义: 接口定义: 初始化需要申请头结点,让头指针指向空的头结点。 将申请结点的代码进行封装: 需要越过头结点 找到尾结点,然后插入到尾结点的后面。 对比不带头结点的单链表的尾插

    2024年02月02日
    浏览(219)
  • 数据结构——单链表的实现(c语言版)

    前言           单链表作为顺序表的一种,了解并且熟悉它的结构对于我们学习更加复杂的数据结构是有一定意义的。虽然单链表有一定的缺陷,但是单链表也有它存在的价值, 它也是作为其他数据结构的一部分出现的,比如在图,哈希表中。 目录 1.链表节点的结构 2.头插

    2024年02月13日
    浏览(60)
  • 【算法与数据结构】 C语言实现单链表队列详解

    前面我们学习了队列的顺序表的实现,本节将用单链表实现队列。 队列也可以数组和链表的结构实现, 使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低 。下面我们先复习一下队列的基本概念: 队列:只允许在一端进行插入

    2024年04月11日
    浏览(60)
  • [C语言][数据结构][链表] 单链表的从零实现!

    目录 零.必备知识 1.一级指针 二级指针 2. 节点的成员列表     a.数据     b.指向下一个节点的指针. 3. 动态内存空间的开辟 (malloc-calloc-realloc) 一.单链表的实现与销毁          1.1 节点的定义         1.2 单链表的尾插         1.3 单链表的头插         1.4 单链表的尾删  

    2024年04月11日
    浏览(76)
  • 【数据结构】单链表的增删查改(C语言实现)

    在上一节中我们提到了顺序表有如下缺陷: 在头部/中间的插入与删除需要挪动数据,时间复杂度为O(N),效率低; 增容需要申请新空间,可能会拷贝数据,释放旧空间,会有不小的消耗; 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容

    2024年02月06日
    浏览(62)
  • 【数据结构】C语言实现单链表的基本操作

    大家好,很高兴又和大家见面啦!!! 在上一篇中,我们详细介绍了单链表的两种创建方式——头插法与尾插法,相信大家现在对这两种方式都已经掌握了。今天咱们将继续介绍单链表的基本操作——查找、插入与删除。在开始今天的内容之前,我们先通过尾插法创建一个单

    2024年02月03日
    浏览(65)
  • Leetcode刷题---C语言实现初阶数据结构---单链表

    删除链表中等于给定值 val 的所有节点 给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5] 示例 2: 输入:head = [ ], val = 1 输出:[ ] 示例 3: 输入:head = [7,7,7,7], val = 7 输出:

    2024年02月15日
    浏览(57)
  • 【数据结构】链表C语言编写的,它定义了一个链表,并实现了一些基本的链表操作,如创建新节点、插入节点、清空链表、输出链表以及查找节点

    这段代码是用C语言编写的,它定义了一个链表,并实现了一些基本的链表操作,如创建新节点、插入节点、清空链表、输出链表以及查找节点。以下是每段代码的详细解释: 文件注释: 这段代码是一个文件注释 包含头文件: #include stdio.h  和  #include stdlib.h :这两个头文件

    2024年02月09日
    浏览(46)
  • 单链表(数据结构)(C语言)

    这里特指无哨兵位单向非循环链表 目录 背景 概念 单链表的实现 前景提示 单链表的结构体定义 单链表的打印 关于为什么不断言phead 关于单链表的逻辑结构和物理结构 单链表的尾插 关于为什么要用到二级指针 关于尾插的本质 关于找尾整个过程的解释 关于为什么打印单链表

    2023年04月22日
    浏览(77)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包