C语言—单链表的创建与插入操作

文章介绍了如何创建单链表,然后将其拆分为两个链表,一个包含原链表的奇数序号节点,另一个包含偶数序号节点。通过核心功能函数,利用尾插法创建L1链表,头插法构建反向链接的L2链表,实现了链表节点的奇偶分离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:KUST_CZY


前言

        创建单链表L1,将单链表L1拆成二个链表,其中以L1为头的链表保持原来向后的链接,一个链表的头为L2,其链接方向与L1相反,L1包含原链表的奇数序号的结点,L2包含原链表的偶数序列的结点,通过main函数完成函数调用。

一、创建链表

1.定义结点(定义一个结构体作为结点)

typedef struct node {
	ElemType data;//存储数据
	struct  node* next;
}Node;

2.创建链表函数(初始化链表)

//使用尾插法创建链表
//d为头结点,n为链表的长度,a[]中存储链表需要的数据
Node* CreateList(Node* d, int n, ElemType a[])
{
	d = (Node*)malloc(sizeof(Node));//分配存储空间
	d->next = NULL;
	Node* p;
	p = d;
	for (int i = 0; i < n; i++)
	{
		Node* newNode;
		newNode = (Node*)malloc(sizeof(Node));
		newNode->data = a[i];
		p->next = newNode;
		p = newNode;
	}
	p->next = NULL;
	return d;
}

3.创建遍历链表显示的函数

//遍历显示
void DisplayList(Node* d) 
{
	Node* p;
	p = d->next;
	while (p)
	{
		printf(" %c ", p->data);
		p = p->next;
	}
}

二、实现核心功能

//实现功能
//核心思路:L1链表利用尾插法创建实现链表创建
//而L2则利用头插法的形式创建链表实现L1与L2的方向相反
void Function(Node* L1, Node* L2)
{
	int n = 1;//奇偶数判断

	//创建空节点读取数据
	Node* q;//q节点用于读取L1的头指针
	q = L1;//q指向第一个结点

	while (q->next)//若q为空
	{
		Node* newnode = (Node*)malloc(sizeof(Node));
		if (n % 2 == 1)//若为奇数
		{
			q = q->next;//下一个
		}
		else//若为偶数
		{
			Node* p = q->next;//用p指向下一个结点
			newnode->data = q->next->data;//为新结点赋值
			newnode->next = L2->next;//新结点指针域指向L2链表的第一个结点
			L2->next = newnode;//L2的第一个结点改为newnode
			q->next = p->next;
			free(p);//释放p
		}
		n++;
	}

	printf("L1链表的数据为:");
	DisplayList(L1);
	printf("\n");
	printf("L2链表的数据为:");
	DisplayList(L2);
}

总结

        字符串或者数组会组成单链表后,传入核心函数中;同时,会创建一个新的空链表用于存储偶数段的数据,进入函数后会利用一个整型进行奇偶性的判断,当判断为奇数时,链表的头指针会指向下一位,并进入下一次循环;如果判断为偶数时,则会将该节点赋值给新创建的链表的头结点,对该去创建的新链表使用头插法来满足与用尾插法创建的原链表d存储数据的形式相反;

       在完成循环后,遍历2个链表并进行数据的遍历输出,最终完成实验;

完整代码如下

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#define NULL 0;

typedef char ElemType;

//定义链表
typedef struct node {
	ElemType data;//存储数据
	struct  node* next;
}Node;

//创建链表
Node* CreateList(Node* d, int n, ElemType a[])
{
	d = (Node*)malloc(sizeof(Node));
	d->next = NULL;
	Node* p;
	p = d;
	for (int i = 0; i < n; i++)
	{
		Node* newNode;
		newNode = (Node*)malloc(sizeof(Node));
		newNode->data = a[i];
		p->next = newNode;
		p = newNode;
	}
	p->next = NULL;
	return d;
}

//遍历显示
void DisplayList(Node* d) 
{
	Node* p;
	p = d->next;
	while (p)
	{
		printf(" %c ", p->data);
		p = p->next;
	}
}

//实现功能
//核心思路:L1链表利用尾插法创建实现链表创建
//而L2则利用头插法的形式创建链表实现L1与L2的方向相反
void Function(Node* L1, Node* L2)
{
	int n = 1;//奇偶数判断

	//创建空节点读取数据
	Node* q;//q节点用于读取L1的头指针
	q = L1;//q指向第一个结点

	while (q->next)//若q为空
	{
		Node* newnode = (Node*)malloc(sizeof(Node));
		if (n % 2 == 1)//若为奇数
		{
			q = q->next;//下一个
		}
		else//若为偶数
		{
			Node* p = q->next;//用p指向下一个结点
			newnode->data = q->next->data;//为新结点赋值
			newnode->next = L2->next;//新结点指针域指向L2链表的第一个结点
			L2->next = newnode;//L2的第一个结点改为newnode
			q->next = p->next;
			free(p);//释放p
		}
		n++;
	}

	printf("L1链表的数据为:");
	DisplayList(L1);
	printf("\n");
	printf("L2链表的数据为:");
	DisplayList(L2);
}


int main()
{
	printf("请输入对应的数据:");
	char A[999];
	gets_s(A);
	int Length = strlen(A);//获取输入的字符串长度
	char* a = A;
	Node* L1 = NULL;
	L1 = CreateList(L1, Length, a);
	Node* L2 = NULL;
	L2 = CreateList(L2, 0, a);
	Function(L1, L2);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值