本周训练总结

本文介绍了几种链表的基本操作,包括计算链表倒数第N个节点的乘积、链表的创建与输出、链表的逆置以及顺序表中删除特定范围内的元素等。这些操作都是通过具体的代码实现来讲解的。

本周写链表,不是很会写,借鉴了网上的一些代码,并加上自己的理解。

7-3 链表倒数n个结点的乘积

本题要求计算单链表倒数n个结点的乘积。例如,给出单链表1 2 3 4 5,则倒数2个结点的乘积为20。

输入格式:

输入有2行,第一个行为2个非负整数m和n。其中m为链表结点个数,n为链表倒数结点的数量。题目保证计算结果在int范围内。 第二行为链表的m个数,以空格分隔。

输出格式:

在一行中输出倒数n个结点的乘积。

输入样例:

5 2
1 2 3 4 5

结尾无空行

输出样例:

20

结尾无空行

样例解释:

20 = 4 * 5

思路:创建一个链表存进输入的数,再通过循环历遍,找到开始计算的节点,开始向后计算。

#include <stdio.h>
#include <stdlib.h>
typedef struct link{
    int data;
    struct link* next;
}link;
link* intlink(int n);
link *intlink(int n)//建立链表存数的函数
{
    int a;
    link* head=NULL;
    link* p=(link*)malloc (sizeof(link));
    p->data=1;
    p->next=NULL;
    head=p;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a);
        link *b=(link*)malloc (sizeof(link));
        b->data=a;
        b->next=NULL;
        p->next=b;
        p=p->next;
    }
    return head;
}

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    link*p=NULL;
    p = intlink(n);
    int sum=1;
    if(n==0||m==0)//节点为0,返回0;
    {
        printf("0");
        return 0;
    }
        
    p=p->next;
    for(int i=0;i<n;i++)//循环历遍
    {
        if(i>n-m-1)//找到节点
        {
            sum*=p->data;
            //printf("%d\n",p->data);
        }
        p=p->next;
    }
    printf("%d\n",sum);
    return 0;
}

7-5 单向链表的创建与输出

本题目要求补充两个函数,实现如下功能:

输入若干个正整数,以-1结束,采取向链表中添加节点的方式来建立一个单链表,并输出这个单链表。

向链表尾部添加节点函数:

Link AppendNode(Link head,int data);

其中Link结构定义如下:

typedef struct link
{
    int data;
    struct link *next;
}*Link;
  • head:链表头指针,如果head为NULL,则会新建头节点
  • data:要添加的节点数据值
  • 函数返回值:添加节点后的链表头指针

输出链表函数:

void DisplyNode(Link head);

  • head :链表头指针

主函数样例:

#include <stdio.h>
#include <stdlib.h>

typedef struct link
{
    int data;
    struct link *next;
}*Link;

Link AppendNode(Link head,int data);
void DisplyNode(Link head);

int main()
{
    int    data;
    Link head = NULL;
    while (1)
    {
        scanf("%d",&data);
        if (data==-1)
            break;
        head = AppendNode(head,data);
    }
    DisplyNode(head);
    return 0;
}


/*在此实现 AppendNode函数 */
/*在此实现DisplyNode函数 */

输入格式:

从键盘输入若干个正整数(空格分隔),以-1结束。

输出格式:

依次输出单链表中各个节点的数据元素值,元素间以逗号分隔。如果链表为空,则输出NULL。参看输出样例。

输入样例:

1 3 5 7 9 -1

结尾无空行

输出样例:

1,3,5,7,9

结尾无空行

输入样例:

-1

结尾无空行

输出样例:

NULL

结尾无空行

本题用函数不会写,就直接写入主函数了,就是链表的建立与输出。

#include <stdio.h>
#include <stdlib.h>
typedef struct link
{
    int data;
    struct link *next;
}Link;
Link *AppendNode(Link *head,int data);
void DisplyNode(Link *head);
int main()
{
    int data;
    Link *head;
    Link *s=(Link*)malloc(sizeof(Link));
    s->data=1;
    s->next=NULL;
    head=s;
    int n=0;
    while (1)
    {
        scanf("%d",&data);
        if (data==-1)
            break;
    Link *p=(Link*)malloc(sizeof(Link));//链表的存储
    p->data=data;
    p->next=NULL;
    s->next=p;
    s=s->next;
        n++;
        //head = AppendNode(head,data);
    }
    //DisplyNode(head);
    int d=0;
    if(n==1)//n=1时的输出
    {
        printf("%d",head->next->data);
        return 0;
    }
    head=head->next;//跳过设定的头节点
    if(head==NULL)
    {
        printf("NULL");
        return 0;
    }
    while(head!=NULL)//输出
    {
        if(d==0)//控制输出格式
        {
          printf("%d",head->data);
            d=1;
          head=head->next;
        }
        if(d==1)
        {
          printf(",%d",head->data);
        }
        head=head->next;
    }
    return 0;
}
/*Link *q;
Link *AppendNode(Link *head,int data)
{
    Link *s=(Link*)malloc(sizeof(Link));
    s->next=NULL;
    q=s;
    Link *p=(Link*)malloc(sizeof(Link));
    p->data=data;
    p->next=NULL;
    s->next=p;
    s=s->next;
    return q;
}
void DisplyNode(Link *head)
{
    int d=0;
    head=head->next;
    if(h==NULL)
    {
        printf("NULL");
        return;
    }
    while(head!=NULL)
    {
        if(d==0)
        {
          printf("%d",head->data);
            d=1;
          head=head->next;
        }
        if(d==1)
        {
          printf(",%d",head->data);
        }
        head=head->next;
    }
}*/

7-7 链表的逆置

输入若干个不超过100的整数,建立单链表,然后将链表中所有结点的链接方向逆置,要求仍利用原表的存储空间。输出逆置后的单链表。

输入格式:

首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据在一行上输入数据个数n及n个不超过100的整数。

输出格式:

对于每组测试,输出逆置后的单链表,每两个数据之间留一个空格。

输入样例:

1
11 55 50 45 40 35 30 25 20 15 10 5

输出样例:

5 10 15 20 25 30 35 40 45 50 55

思路:首先创建一个顺序链表,在创建一个倒置函数,最后顺序输出。

 #include <stdio.h>
#include <stdlib.h>
typedef struct link{
    int data;
    struct link *next;
}link;
link reverse(struct link *ls)//倒置函数
{
    if(ls->next==NULL)//判断是否要倒置
        return;
    if(ls->next->next==NULL)
        return;
    struct link *last=ls->next;//尾节点
    struct link *pre=ls->next;//前一个结点
    struct link *cur=ls->next;//当前节点
    struct link *new=NULL;//下一个节点
    while(cur)//完成倒置
    {
        new=cur->next;//下一个节点是当前的下一个
        cur->next=pre;//当前的下一个节点是前一个
        pre=cur;//前一个有等于当前
        cur=new;//当前等于下一个
    }
    ls->next=pre;
    last->next=NULL;
}
int main()
{
    int t,a,n;
    scanf("%d",&t);
    while(t--)
    {
        int d=0;
        struct link* head;
        struct link* s;
        s=NULL;
        head=NULL;
        struct link *p=(link*)malloc (sizeof(link));
        head=p;
        scanf("%d",&n);
        while(n--)
        {
       scanf("%d",&a);
        link *b=(link*)malloc (sizeof(link));
        b->data=a;
        b->next=NULL;
        p->next=b;
        p=p->next;
            d++;
        }
        reverse(head);
        s=head->next;
        while(s!=NULL)
        {
            printf("%d",s->data);
            s=s->next;
            if(s!=NULL)
                printf(" ");
        }
        printf("\n");
    }
    return 0;
}

7-10 顺序表(删除)

已知一组数据,采用顺序存储结构存储,其中所有的元素为整数。设计一个算法,删除元素值在[x,y]之间的所有元素

输入格式:

输入包含三行数据,第一行是表中元素个数,第二行是顺序表的各个元素,第三行是区间x和y。

输出格式:

删除元素值在[x,y]之间的所有元素后,输出新的顺序表。(最后无空格)

输入样例:

在这里给出一组输入。例如:

10
55 11 9 15 67 12 18 33 6 22
10 20

结尾无空行

输出样例:

在这里给出相应的输出。例如:

55 9 67 33 6 22

结尾无空行

思路:这道题相对简单,就是对每个节点的值进行判断,符合就就输出,不符合下一个。

#include <stdio.h>
#include <stdlib.h>
typedef struct link{
    int data;
    struct link *next;
}link;
int main()
{
    int n;
    scanf("%d",&n);
     struct link *head=(link*)malloc(sizeof(link));
    struct link *s=(link*)malloc(sizeof(link));
    head=NULL;
    head=s;
    for(int i=1;i<=n;i++)
    {
        int x;
        scanf("%d",&x);
        struct link *p=(link*)malloc(sizeof(link));
        p->data=x;
        p->next=NULL;
        s->next=p;
        s=s->next;
    }
    int a,b;
    scanf("%d%d",&a,&b);
    head=head->next;
    int d=0;
    while(head!=NULL)
    {
        if(d==0)
        {
            if(head->data<a||head->data>b)
        {
          printf("%d",head->data);
            d=1;
                head=head->next;
        }
        }
        if(d==1)
        {
            if(head->data<a||head->data>b)
        {
          printf(" %d",head->data);
        }
        }
        head=head->next;
    }
     
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值