7-7 师--链表的结点插入 (20 分)

该程序实现了对链表的一系列插入操作,并按顺序打印链表的所有元素。给定一个链表头指针和一系列操作,每次操作在指定位置插入新元素。如果位置超出链表长度,则将元素添加到链表末尾。程序读取操作次数和每个操作的详细信息,然后输出最终链表的元素。

给出一个只有头指针的链表和 n 次操作,每次操作为在链表的第 m 个元素后面插入一个新元素x。若m 大于链表的元素总数则将x放在链表的最后。

输入格式:

多组输入。

每组数据首先输入一个整数n(1<=n<=100),代表有n次操作。

接下来的n行,每行有两个整数Mi(0<=Mi<=10000),Xi。

输出格式:

对于每组数据。从前到后输出链表的所有元素,两个元素之间用空格隔开。

样例">输入样例:

4
1 1
1 2
0 3
100 4

输出样例:

3 1 2 4
#include<stdio.h>
#include<stdlib.h>
struct node
{
    int data;
    struct node *next;
};
void insert(struct node *head,int Mi,int Xi)
{
    struct node *q,*p;
    int i;
    q=(struct node*)malloc(sizeof(struct node));
    p=head;
    q->data=Xi;
    for(i=0;i<Mi&&p->next!=NULL;i++)
    {
        p=p->next;
    }
    q->next=p->next;
    p->next=q;
}
void pri(struct node *p)
{
    while(p)
    {
        if(p->next==NULL)
        {
            printf("%d\n",p->data);
        }
        else
            printf("%d ",p->data);
        p=p->next;
    }
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        struct node *head;
        head=(struct node*)malloc(sizeof(struct node));
        head->next=NULL;
        for(int i=0;i<n;i++)
        {
            int Mi,Xi;
            scanf("%d %d",&Mi,&Xi);
            insert(head,Mi,Xi);
        }
        pri(head->next);
    }
    return 0;
}

 

求解链表倒数n个结点的乘积,有以下两种常见的算法实现思路及代码: ### 方法一:先计算链表长度 先计算链表的长度`m`,然后找到倒数第`m - n`个结点,从该结点开始遍历到链表末尾,将经过的结点值相乘得到结果。 ```c #include <stdio.h> #include <malloc.h> typedef struct node { int data; struct node* next; } linklist; int main() { int a, n, i, m1, m, con = 1; linklist *head, *p, *r; head = (linklist*)malloc(sizeof(linklist)); p = r = head; // 读取链表长度 m 和 n scanf("%d", &m); scanf("%d", &n); m1 = m; // 构建链表 while (m--) { scanf("%d", &a); p = (linklist*)malloc(sizeof(linklist)); p->data = a; r->next = p; r = p; } r->next = NULL; p = head->next; // 移动到倒数第 n 个结点的前一个结点 for (i = 0; i < m1 - n; i++) { p = p->next; } // 计算倒数 n 个结点的乘积 while (p != NULL) { con = (p->data) * con; p = p->next; } // 输出结果 printf("%d", con); return 0; } ``` ### 方法二:双指针法 使用两个指针`p1`和`p2`,先将`p2`移动`n`步,然后`p1`和`p2`同时移动,当`p2`到达链表末尾时,`p1`正好指向倒数第`n`个结点,然后从`p1`开始遍历到链表末尾计算乘积。 ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } Node; // 创建新节点 Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; return newNode; } // 插入节点到链表尾部 void insertNode(Node** head, int data) { Node* newNode = createNode(data); if (*head == NULL) { *head = newNode; } else { Node* temp = *head; while (temp->next != NULL) { temp = temp->next; } temp->next = newNode; } } // 计算链表倒数 n 个结点的乘积 int productOfLastN(Node* head, int n) { if (head == NULL || n <= 0) { return 0; } Node* p1 = head; Node* p2 = head; // 移动 p2 指针 n 步 for (int i = 0; i < n; i++) { if (p2 == NULL) { return 0; // n 大于链表长度 } p2 = p2->next; } // 同时移动 p1 和 p2 指针 while (p2 != NULL) { p1 = p1->next; p2 = p2->next; } // 计算乘积 int product = 1; while (p1 != NULL) { product *= p1->data; p1 = p1->next; } return product; } int main() { Node* head = NULL; int m, n, data; // 读取链表长度 m 和 n scanf("%d", &m); scanf("%d", &n); // 构建链表 for (int i = 0; i < m; i++) { scanf("%d", &data); insertNode(&head, data); } // 计算倒数 n 个结点的乘积 int result = productOfLastN(head, n); printf("%d", result); return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值