1. 写在前面
当时绪论作业有三个,但是只留存了一个,剩下的两个删了。数据结构绪论作业是比较简单的,并且不会计入总成绩,所以放心大胆写。
2. 题目要求
将数组按输入的数字K来进行逆置,最后剩余的个数不满K的数字不做变换。例如:1,2,3,4,5,6,7,8,9,0按2逆置为:2,1,4,3,6,5,8,7,0,9;按3逆置为:3,2,1,6,5,4,9,8,7,0。
3. 代码
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
} DATA;
DATA *Create(int n); //创建链表
void Outlet(DATA *list); //输出链表
void InverK(DATA *list, int k, int n); //K排序
void main()
{
int n; //输入的数字总数
int k; //逆置数量
scanf("%d", &n);
scanf("%d", &k);
DATA *list=Create(n);
Outlet(list);
InverK(list, k, n);
}
DATA *Create(int n) //创建链表
{
int data;
int i;
DATA *head=(DATA *)malloc(sizeof(DATA));
if(head==NULL)
{
printf("No enough memory!\n");
exit(1);
}
DATA *pt=head;
pt->next=NULL;
for(i=0; i<n; i++)
{
DATA *ps=(DATA *)malloc(sizeof(DATA));
if(ps==NULL)
{
printf("No enough memory!\n");
exit(1);
}
printf("输入第%d个节点的数据:", i+1);
scanf("%d", &data);
ps->data=data;
pt->next=ps;
ps->next=NULL;
pt=ps;
}
return head;
}
void Outlet(DATA *list)
{
DATA *pt=list->next;
printf("原链表为:");
if(pt==NULL)
printf("NULL");
while(pt!=NULL)
{
printf("%d ", pt->data);
pt=pt->next;
}
printf("\n");
}
void InverK(DATA *list, int k, int n)
{
DATA *card=list->next;
DATA *pd=list;
DATA *d1=NULL;
DATA *d2=NULL;
int i;
int j;
for(i=0; i<n/k; i++)
{
d1=pd->next;
d2=d1;
pd->next=NULL;
for(j=0; j<k; j++)
{
card=d1->next;
d1->next=pd->next;
pd->next=d1;
d1=card;
}
pd=d2;
pd->next=card;
}
DATA *pt=list->next;
printf("K逆置:");
while(pt!=NULL)
{
printf("%d ", pt->data);
pt=pt->next;
}
}
4. 总结
整体还是比较简单的,用的也都是基础的链表语法,主要是需要熟悉链表的基本语法,例如创建,插入(包括头插法、尾插法),删除等一系列操作。