欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解C语言之单链表

程序员文章站 2022-03-10 13:30:37
目录一、思路步骤1. 定义结构体2.初始化3.求当前数据元素的个数4.插入5.删除6.释放内存空间二、代码总结一、思路步骤1. 定义结构体a.数据域:用来存放数据b.指针域:用来存放下一个数据的位置2...

一、思路步骤

1. 定义结构体

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

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

2.初始化

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

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

详解C语言之单链表

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

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

c.返回size

4.插入

详解C语言之单链表

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

5.删除

详解C语言之单链表

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;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!