绪论作业-K逆置

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. 总结

整体还是比较简单的,用的也都是基础的链表语法,主要是需要熟悉链表的基本语法,例如创建,插入(包括头插法、尾插法),删除等一系列操作。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值