PTA: 奇数值结点链表(C语言版)

本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中奇数值的结点重新组成一个新的链表。链表结点定义如下:

struct ListNode {
int data;
ListNode *next;
};

函数接口定义:
struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );

函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。

函数getodd将单链表L中奇数值的结点分离出来,重新组成一个新的链表。返回指向新链表头结点的指针,同时将L中存储的地址改为删除了奇数值结点后的链表的头结点地址(所以要传入L的指针)。

裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>

struct ListNode {
int data;
struct ListNode *next;
};

struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );
void printlist( struct ListNode *L )
{
struct ListNode *p = L;
while § {
printf("%d “, p->data);
p = p->next;
}
printf(”\n");
}

int main()
{
struct ListNode *L, *Odd;
L = readlist();
Odd = getodd(&L);
printlist(Odd);
printlist(L);

return 0;

}

/* 你的代码将被嵌在这里 */

输入样例:
1 2 2 3 4 5 6 7 -1

输出样例:
1 3 5 7
2 2 4 6

struct ListNode *readlist()
{
    //因为需要正序输出,故可采用尾插法 
    struct ListNode *head, *p, *q, *tail;
    head = (struct ListNode*)malloc(sizeof(struct ListNode));
    head->next = NULL;
    tail = head;
    while (1)
    {
        int temp;
        scanf("%d", &temp);
        if (temp == -1)  //当读到-1时退出while循环 
            break;
        p = (struct ListNode*)malloc(sizeof(struct ListNode));
        p->data = temp;
        tail->next = p;
        p->next = NULL;
        tail = p;
    }

    return head->next;   //不能返回head,因为题目printlist函数是直接输出p->data的而head是空结点 
}
//为什么用**L二级指针?
//我们知道传递形参时,无法通过形参改变实参值,我们可以通过指针或者c++中的引用来改变实参值
//*L,同理可以改变*L所指的值得大小,而没办法改变自身,自身就是L,即地址
//故我们**L通过二级指针可以改变*L,即地址
struct ListNode *getodd( struct ListNode **L )
{
    struct ListNode *head, *p, *q, *OddHead, *tail;
    int  i, j, a[100];

    head = *L;
    i = 0;
    while ((head->data % 2) == 1)    //跳过奇数结点,找到第一个偶数结点
    {
        a[i++] = head->data; //储存奇数结点的data大小
        head = head->next;
        if (head == NULL)
            break;
    }
    p = head;
    while (p != NULL)
    {
        //删除奇数结点
        if ((p->data % 2) != 0)
        {
            a[i++] = p->data;
            q->next = p->next;
            p = p->next;
            continue;
        }
        q = p;
        p = p->next;
    }
    *L = head;  //偶数链表头节点
    //构造奇数链表
    OddHead = (struct ListNode*)malloc(sizeof(struct ListNode));
    tail = OddHead;
    for (j = 0; j < i; j++)
    {
       p = (struct ListNode*)malloc(sizeof(struct ListNode));
       p->data = a[j];
       p->next = NULL;
       tail->next = p;
       tail = p;
    }

    return OddHead->next;
}
  • 8
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
三个进程P1,P2,P3,以及有N(>1)个单元的缓冲区。P1调用produce()产生一个整数,调用put()将其放入缓冲区。P2调用getodd()从缓冲区取出一个奇数,然后调用countodd()计算奇数的个数;P2调用geteven()从缓冲区取出一个偶数,然后调用counteven()计算偶数的个数。用信号量机制实现进程同步 使用到的函数和信号量 HANDLE mutex; HANDLE empty; HANDLE full; 创建信号量 HANDLE CreateSemaphore( __in_opt LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,// lpSemaphoreAttributes是信号量的安全属性 可为NULL __in LONG lInitialCount,// lInitialCount是初始化的信号量 __in LONG lMaximumCount,// lMaximumCount是允许信号量增加到最大 __in_opt LPCWSTR lpName//lpName是信号量的名称 可为NULL ); 创建互斥信号量 HANDLE CreateMutex(  LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针 可为NULL  BOOL bInitialOwner, // 初始化互斥对象的所有者  LPCTSTR lpName // 指向互斥对象名的指针 ); 申请一个资源 WaitForSingleObject(HANDLE full,INFINITE); 释放资源 ReleaseSemaphore( __in HANDLE hSemaphore,// hSemaphore是要增加的信号量句柄 __in LONG lReleaseCount,// lReleaseCount是增加的计数。 __out_opt LPLONG lpPreviousCount//lpPreviousCount是增加前的数返回。 ); 释放互斥信号量 BOOL ReleaseMutex(HANDLE hMutex); DWORD WaitForMultipleObjects( DWORD nCount, // number of handles in array CONST HANDLE *lpHandles, // object-handle array BOOL bWaitAll, // wait option DWORD dwMilliseconds // time-out interval );

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值