作者: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);
}