基于C构造单链表

概念

其所有节点除了包含自己存储的元素,还能够指向其他结点(地址)
优点
不要求大片连续空间,改变容量方便
缺点
不可随机存取,要耗费一定空间存放指针

创建

头插法

#include"head.h"
typedef int ElemType;
typedef struct Node
{
	ElemType data;
	struct Node* next;
	int length;
}LNode,*LinkList;//用来区分表和点

LinkList InitList1()
{
	printf("头插法\n");
	LinkList head = (LinkList)malloc(sizeof(LNode));//创建一个头
	LNode* node = NULL;//定义新节点

	head->next = NULL;
	node = head->next;//新节点的下一位永远指向空
	printf("创建几个节点?\n");
	int cnt;
	scanf("%d", &cnt);
	for (int i = 0; i < cnt; i++)
	{
		node = (LinkList)malloc(sizeof(LNode));//为新节点开辟空间
		int value;
		printf("请输入节点元素值\n");
		scanf("%d", &value);
		node->data = value;//为新节点赋值,node存放的data为value
		node->next = head->next;//将头指针所指的下一个节点赋值给新节点所指的下一个位置
		head->next = node;//将新节点的位置赋值给head所指的下一个位置
	}
	return head;
}
LinkList TraverseList(LinkList head)
{
	int i = 1;
	while (head->next!=NULL)//head本身不存参数,若下一位非空则输入合法
	{
		head = head->next;//表的数值从head所指的下一个节点开始算
		printf("元素%d:%d\n",i,head->data);
		i++;
	}
	return 0;
}
int main()
{
	LinkList head = InitList1();
	TraverseList(head);
}

结果
基于C构造单链表_第1张图片
注:
①头插法,顾名思义,在头结点后依次插入,新来的元素总会在头结点后面,因此输出也为倒序输出,相对不直观,因此个人喜欢尾插法。
②head.h头文件是个人所写,只是为了防止vs报错,正常用stdio.h之类的也可以

尾插法

LinkList InitList2()
{
	printf("尾插法\n");
	LinkList head = (LinkList)malloc(sizeof(LNode));
	LNode* node = NULL;
	LNode* end = NULL;
	head->next = NULL;
	end = head;
	printf("创建几个节点?\n");
	int cnt;
	scanf("%d", &cnt);
	for (int i = 0; i < cnt; i++)
	{
		node = (LinkList)malloc(sizeof(LNode));//为新节点开辟空间
		int value;
		printf("请输入节点元素值\n");
		scanf("%d", &value);
		node->data = value;
		end->next = node;
		end = node;
	}
	end->next = NULL;
	return head;//必须返回一个值
}

运行结果
基于C构造单链表_第2张图片

插入节点

头插法

LinkList Insert(LinkList head)
{
	LNode* node = (LinkList)malloc(sizeof(LNode));
	int n, elem;
	printf("请输入需要插入的元素(头插)\n");
	scanf("%d",&elem);
	node->data = elem;
	node->next = head->next;
	head->next = node;
	printf("插入元素%d成功\n",node->data);
	return head;
}

尾插法

LinkList Insert2(LinkList head)
{
	LNode* node = (LinkList)malloc(sizeof(LNode));
	int n, elem;
	printf("请输入需要插入的元素(尾插)\n");
	scanf("%d", &elem);
	node->data = elem;
	while (head->next)
	{
		head = head->next;
	}
	head->next = node;
	node->next = NULL;
	printf("插入元素%d成功\n", node->data);
	return head;
}

中间插入

LinkList Insert3(LinkList head)//无法头插
{
	int n, elem;
	printf("新插入的元素放置の位置\n");
	scanf("%d", &n);
	printf("请输入要插入的元素\n");
	scanf("%d", &elem);
	LNode* node = (LinkList)malloc(sizeof(LNode));
	node->next = NULL;
	node->data = elem;
	int len = 0;
	while (head->next)
	{
		len++;
		head = head->next;
		if (len == n)
		{
			node->next = head->next;
			head->next = node;
		}
	}
	//printf("表长:%d\n", len);
	return head;
	
}

你可能感兴趣的:(新手,链表,c语言,数据结构)