C语言数据结构实习题篇:
已知有如下单链表(a1,a2,a3,…an)n为偶数,要求写出一个时间复杂度为O(n),辅助空间为O(1)的算法,将上述单链表转化成偶数下标倒序排列,奇数下标正序排列的单链表。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElementType;
typedef struct {
ElementType data;
struct Node * next;
}Node, *LinkList;
//合并两个单链表
LinkList CollectLinkList(LinkList L1, LinkList L2)
{
LinkList p = L1->next;
while (p->next)
{
p = p->next;
}
p->next = L2->next;
free(L2);
return L1;
}
//尾插法建立一个单链表
LinkList CreatAnNomalList(LinkList L, int *p, int n)
{
Node* r;
Node* s;
int flag = 1;
int i = 0;
r = L;
while (flag)
{
if (i < n)
{
s = (LinkList)malloc(sizeof(Node));
s->data = p[i];
r->next = s;
r = s;
i = i + 1;
}
else
{
flag = 0;
r->next = NULL;
}
}
return L;
}
LinkList CreatFromHeadList(LinkList L, int *p, int n)//头插法建立单链表且只要是偶数下标的元素
{
LinkList s;
int i;
for (i = 0; i < n; i++)
{
if ((i < n) && i % 2 != 0)
{
s = (LinkList)malloc(sizeof(Node));
s->data = p[i];
s->next = L->next;
L->next = s;
}
}
return L;
}
LinkList CreatFromTailList(LinkList L, int *p, int n)//尾插法建立一个单链表且只要下标是奇数的元素
{
Node * r, *s;
int i;
r = L;
//r->next = NULL;
for (i = 0; i < n; i++)
{
if ((i < n) && i % 2 == 0)
{
s = (LinkList)malloc(sizeof(Node));
s->data = p[i];
r->next = s;
r = s;
}
}
r->next = NULL;
return L;
}
void output(LinkList L)
{
LinkList p = L->next;
//p->next = NULL;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
//动态建立一个一维数组
int *CreatAArray(int n)
{
int *p;
p = (int*)malloc(n*(sizeof(int)));//动态申请内存
memset(p, 0, n);//初始化,每个元素都为零
int i;
for (i = 0; i < n; i++)//数组赋值
{
scanf_s("%d", &p[i]);
}
//free(p);//释放内存
return p;
}
int main()
{
LinkList L1, L2, L0, L;
int *p;
int n;
L1 = (LinkList)malloc(sizeof(Node));//下标是偶数且倒序排列的单链表
L2 = (LinkList)malloc(sizeof(Node));//下标是奇数且正序排列的单链表
L0 = (LinkList)malloc(sizeof(Node));//原始单链表
L = (LinkList)malloc(sizeof(Node));//L1和L2合并后
L1->next = NULL;
L2->next = NULL;
L0->next = NULL;
L->next = NULL;
printf("请输入该链表的长度n:\n");
scanf_s("%d", &n);
//p为用户自己创建的一维数组
p = CreatAArray(n);
//头插法建立一个单链表
L0 = CreatAnNomalList(L0, p, n);
printf("转化前的单链表\n");
output(L0);
//头插法得到按照偶数下标逆序排列的链表
printf("******测试一******\n");
L1 = CreatFromHeadList(L1, p, n);
output(L1);
//尾插法得到按照奇数下标正序排列的链表
printf("******测试二******\n");
L2 = CreatFromTailList(L2, p, n);
output(L2);
//将按偶数下标倒序排列和按照奇数下标正序排列的两个链表连起来
L = CollectLinkList(L1, L2);
printf("连起来的两个链表\n");
output(L);
system("pause");
return 0;
}
欢迎大家评论指教,我将不胜感激。
[1]: http://meta.math.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference
[2]: https://mermaidjs.github.io/
[3]: https://mermaidjs.github.io/
[4]: http://adrai.github.io/flowchart.js/