您现在的位置是:群英 > 开发技术 > 编程语言
用C语言怎样实现单链表,思路步骤是什么?
Admin发表于 2021-12-20 17:47:561013 次浏览

    这篇文章给大家分享的是C语言怎样实现单链表的内容,本文会有详细的思路步骤介绍,文中示例代码也介绍的很详细,对大家学习和理解C语言的单链表有一定的参考价值,那么接下来感兴趣的朋友就跟随小编一起学习一下吧。

    一、思路步骤

    1. 定义结构体

    a.数据域:用来存放数据

    b.指针域:用来存放下一个数据的位置

    2.初始化

    申请头结点,并将其初始化为空

    3.求当前数据元素的个数

    a.设置一个指针变量p指向头结点和计数变量size等于0

    b.循环判断p->next是否为空,如果不为空,就让指针p指向它的直接后继结点,并让size自增

    c.返回size

    4.插入


    a.设置两个指针,一个指向头结点,另一个要动态申请内存空间存放要插入的数
    b.找到要插入位置的前一位,并判断插入位置是否正确
    c.生成新结点,给新结点数据域赋值,执行步骤①,在执行步骤②

    5.删除


    a.设置两个指针p、q,p指向头结点,q指向要被删除的结点

    b.找到要删除位置的前一位,并判断删除位置是否正确、存在

    c.q指向被删除的结点,将被删除结点的数据域赋值给x,p指向被删除结点的下一个结点,释放q的内存空间

    6.释放内存空间

    最后记得将头结点置空哦!要不然容易出现野指针。

    二、代码

    #include <stdio.h>
    #include <stdlib.h>
    typedef int DataType;//给int起个别名,方便以后修改
    typedef struct Node
    {
    	DataType data;//数据域
    	struct Node *next;//指针域
    }SLNode;
    //初始化
    void ListInit(SLNode **head)
    {
    	*head = (SLNode *)malloc(sizeof(SLNode));//申请头结点
    	(*head)->next = NULL;
    }
    //求当前数据元素个数
    int ListLength(SLNode *head)
    {
    	SLNode *p = head;
    	int size = 0;
    	while (p->next != NULL)
    	{
    		p = p->next;
    		size++;
    	}
    	return size;
    }
    //插入
    int ListInsert(SLNode *head, int i, DataType x)
    {
    	SLNode *p, *q;
    	int j;
    	p = head;
    	j = -1;
    	while (p->next != NULL && j < i - 1)
    	{
    		p = p->next;
    		j++;
    	}
    	if (j != i - 1)
    	{
    		printf("插入参数位置错误!!!\n");
    		return 0;
    	}
    	q = (SLNode *)malloc(sizeof(SLNode));//生成新结点
    	q->data = x;
    	q->next = p->next;
    	p->next = q;
    	return 1;
    }
    //删除
    int ListDelete(SLNode *head, int i, DataType *x)
    {
    	SLNode *p, *q;
    	int j;
    	p = head;
    	j = -1;
    	while (p->next != NULL && p->next->next != NULL && j < i - 1)
    	{
    		p = p->next;
    		j++;
    	}
    	if (j != i - 1)
    	{
    		printf("删除位置参数错误!!!\n");
    		return 0;
    	}
    	q = p->next;
    	*x = q->data;
    	p->next = p->next->next;
    	free(q);//释放被删除结点的内存空间
    	return 1;
    }
    //按位取
    int ListGet(SLNode *head, int i, DataType *x)
    {
    	SLNode *p;
    	int j;
    	p = head;
    	j = -1;
    	while (p->next != NULL && j < i)
    	{
    		p = p->next;
    		j++;
    	}
    	if (j != i)
    	{
    		printf("取出位置参数错误!!!\n");
    		return 0;
    	}
    	*x = p->data;
    	return 1;
    }
    //释放
    void ListDestroy(SLNode **head)
    {
    	SLNode *p, *q;
    	p = *head;
    	while (p != NULL)
    	{
    		q = p;
    		p = p->next;
    		free(q);
    	}
    	*head = NULL;
    }
    
    int main()
    {
    	SLNode *head;
    	int i, x;
    	ListInit(&head);
    	for (i = 0; i < 10; i++)
    		ListInsert(head, i, i + 10);
    	ListDelete(head, 9, &x);
    	for (i = 0; i < ListLength(head); i++)
    	{
    		ListGet(head, i, &x);
    		printf("%d ", x);
    	}
    	ListDestroy(&head);
    	system("pause");
    	return 0;
    }
    

    总结

        关于C顺序表实现单链表的内容就介绍到这,上述示例具有一定的借鉴价值,感兴趣的朋友可以参考,希望能对大家有帮助,想要了解更多C语言的内容,大家可以关注其它的相关文章。

    文本转载自PHP中文网

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

    标签: C语言 单链表
    相关信息推荐
    2022-07-06 17:12:20 
    摘要:结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体,每个值称为结构体的成员。下面介绍下golang中的struct,感兴趣的朋友一起看看吧
    2022-07-15 17:55:05 
    摘要:本篇文章给大家介绍一下bootstrap实现响应式图片的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
    2022-05-13 17:52:25 
    摘要:方法:1、利用global关键字,在方法内用“global $外部变量名;”语句导入外部变量即可;2、利用“$GLOBALS”变量,在方法内直接用“$GLOBALS['a']”语句引用外部变量即可;3、利用值传递,将外部变量用参数传递进去。
    云活动
    推荐内容
    热门关键词
    热门信息
    群英网络助力开启安全的云计算之旅
    立即注册,领取新人大礼包
    • 联系我们
    • 24小时售后:4006784567
    • 24小时TEL :0668-2555666
    • 售前咨询TEL:400-678-4567

    • 官方微信

      官方微信
    Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
    增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
    免费拨打  400-678-4567
    免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
    微信公众号
    返回顶部
    返回顶部 返回顶部