请同学们先看提示,自行思考实践后无果再看通过代码。学习不要欺骗自己!!!
欢迎校友+q3023225096进行讨论交流
6个功能一步到位,取消注释以启用功能
代码仅供参考
#include<stdio.h>
#include<stdlib.h>
int count = 0;
struct linklist //创建结构体类型
{
int data;
int data2;
struct linklist* next;
};
//以下是函数声明部分
struct linklist* initial(void); //链表初始化,包括了开头为0的错误情况
void printlist(struct linklist* plisthead); //遍历打印链表
struct linklist* killrept(struct linklist* plisthead); //删除重复项
struct linklist* getmid(struct linklist* plisthead); //获取并返回链表中间节点地址
int gcdFarlei(int x, int r); //返回法雷数列分子分母的最大公约数
struct linklist* creatFarlei(void); //创建n阶法雷数列
struct linklist* sortFarlei(struct linklist* plisthead); //递增排序法雷数列
void printFarlei(struct linklist* plisthead); //遍历打印法雷数列,0/1,1/1单独输出
void backprint(struct linklist* plisthead); //打印倒数第k个链表节点
struct linklist* sort(struct linklist* plisthead); //递增排序链表
//以下是主函数部分,包括习题要求所有功能
int main()
{
//printlist(initial()); //打印链表
//printlist(killrept(initial())); //打印删除重复项后的链表
//printlist(getmid(initial())); //打印中间及其后面的链表
//printFarlei(sortFarlei(creatFarlei())); //打印n阶法雷数列
//backprint(initial()); //打印倒数第k个链表节点
//printlist(sort(initial())); //打印递增排序链表
return 0;
}
//以下是函数定义部分
struct linklist* initial(void) //链表初始化,包括了开头为0的错误情况
{
struct linklist* plisthead = NULL, * ptemp = NULL, * pnewnode = NULL;
plisthead = (struct linklist*)malloc(sizeof(struct linklist*));
ptemp = plisthead;
do
{
pnewnode = (struct linklist*)malloc(sizeof(struct linklist*));
scanf("%d", &pnewnode->data);
count++;
ptemp->next = pnewnode;
ptemp = pnewnode;
} while (pnewnode->data != 0);
count--;
pnewnode->next = NULL;
if ((plisthead->next)->data == 0)
{
printf("NULL");
exit(0);
}
else
return plisthead;
}
void printlist(struct linklist* plisthead) //遍历打印链表
{
int space = 0;
for (plisthead = plisthead->next; plisthead->data != 0; plisthead = plisthead->next)
{
if (space == 1)
printf(" %d", plisthead->data);
if (space == 0)
{
printf("%d", plisthead->data);
space = 1;
}
}
return;
}
struct linklist* killrept(struct linklist* plisthead) //删除重复项
{
struct linklist* pi = NULL, * pj = NULL, * pij = NULL;
for (pi = plisthead->next; pi->data != 0; pi = pi->next)
for (pj = pi->next, pij = pi; pj->data != 0; )
{
if (pi->data == pj->data)
{
pij->next = pj->next;
pj = pij->next;
}
else
{
pij = pj;
pj = pj->next;
}
}
return plisthead;
}
struct linklist* getmid(struct linklist* plisthead) //获取并返回链表中间节点地址
{
if (count % 2 != 0)
for (int i = count / 2.0 + 0.5 - 1; i > 0; i--)
plisthead = plisthead->next;
if (count % 2 == 0)
for (int i = count / 2 - 1; i > 0; i--)
plisthead = plisthead->next;
return plisthead;
}
int gcdFarlei(int x, int r) //返回法雷数列分子分母的最大公约数
{
return (r == 0) ? x : gcdFarlei(r, x % r);
}
struct linklist* creatFarlei(void) //创建n阶法雷数列
{
int x, y, n;
scanf("%d", &n);
if (n < 2)
{
if (n == 1) printf("0/1 1/1");
else printf("NULL");
exit(0);
}
else
{
struct linklist* plisthead, * pnewnode, * ptemp;
plisthead = (struct linklist*)malloc(sizeof(struct linklist*));
pnewnode = (struct linklist*)malloc(sizeof(struct linklist*));
plisthead->next = pnewnode;
for (y = 2; y <= n; y++)
for (x = 1; x < y; x++)
if (gcdFarlei(x, y % x) == 1)
{
pnewnode->data = x;
pnewnode->data2 = y;
ptemp = pnewnode;
pnewnode = (struct linklist*)malloc(sizeof(struct linklist*));
ptemp->next = pnewnode;
}
pnewnode->data = 0;
return plisthead;
}
}
struct linklist* sortFarlei(struct linklist* plisthead) //递增排序法雷数列
{
int flag = 1;
struct linklist* pi = NULL, * pj = NULL, * pi0;
while (flag == 1)
for (flag = 0, pi0 = plisthead, pi = pi0->next, pj = pi->next; pj->data != 0; pi0 = pi, pi = pj, pj = pj->next)
if ((double)pi->data / pi->data2 > (double)pj->data / pj->data2)
{
pi0->next = pj;
pi->next = pj->next;
pj->next = pi;
flag = 1;
}
return plisthead;
}
void printFarlei(struct linklist* plisthead) //遍历打印法雷数列,0/1,1/1单独输出
{
printf("0/1 ");
for (plisthead = plisthead->next; plisthead->data != 0; plisthead = plisthead->next)
printf("%d/%d ", plisthead->data, plisthead->data2);
printf("1/1");
return;
}
void backprint(struct linklist* plisthead) //打印倒数第k个链表节点
{
int k = 0;
scanf("%d", &k);
if (k > count)
{
printf("NULL");
return;
}
plisthead = plisthead->next;
for (int i = count - k; i > 0; i--)
plisthead = plisthead->next;
printf("%d", plisthead->data);
}
struct linklist* sort(struct linklist* plisthead) //递增排序链表
{
int temp, flag = 1;
struct linklist* pi = NULL, * pj = NULL;
while (flag == 1)
for (flag = 0, pi = plisthead->next, pj = pi->next; pj->data != 0; pi = pi->next, pj = pi->next)
if (pi->data > pj->data)
{
temp = pi->data;
pi->data = pj->data;
pj->data = temp;
flag = 1;
}
return plisthead;
}