PTA C语言 浙江大学 函数题 6-37 删除单链表偶数节点

本文介绍了如何用链表结合数组的方法创建链表,并实现删除链表中所有偶数值节点的功能。通过遍历原链表筛选奇数值,再创建新链表存放这些值。

 

 

 

 

struct ListNode *createlist(){
    struct ListNode *head,*p,*q;
    head = NULL;
    q = NULL;
    int n;
    while(1){
        scanf("%d",&n);
        if(n==(-1)){
            break;
        }
        else{
            p = (struct ListNode *)malloc(sizeof(struct ListNode));
            p->data = n;
            if(head==NULL){
                head = p;
            }
            else{
                q->next = p;
            }
            q = p;
        }
    }
    if(q!=NULL){
        q->next = NULL;
    }
    return head;
}
struct ListNode *deleteeven( struct ListNode *head ){
    struct ListNode *head0,*p,*q,*head1;
    head1 = NULL;
    int a[1000],count=0,i;
    if(head==NULL){
        return head;
    }
    head0 = head;
    q = NULL;
    while(head0!=NULL){
        if(head0->data%2==1){
            a[count] = head0->data;
            count++;
        }
        head0 = head0->next;
    }
    a[count] = '\0';
    for(i=0;i<count;i++){
        p = (struct ListNode *)malloc(sizeof(struct ListNode));
        p->data = a[i];
        if(head1==NULL){
            head1 = p;
        }
        else{
            q->next = p;
        }
        q = p;
    }
    if(q!=NULL){
        q->next = NULL;
    }
    return head1;
}

第一个创建链表的函数没什么好说的

第二个删除结点中的偶数数据,我这里使用的方法依旧是链表+数组相结合(披着链表的皮的数组),首先先对链表进行遍历,将奇数的数据存到数组里面,然后再创建新的链表,将数组里面的数据一次存放到新链表里面,最后返回新链表的首地址

属于是投机取巧的方法了,希望咱老师看到了不要骂我,呜呜呜

参考提供的引用内容中没有直接关于PTA 6 - 1目(删除单链表偶数节点)的解决方案。不过可以基于引用[1]中删除单链表指定位置节点的思路来编写删除单链表偶数节点的代码。 以下是一个可能的C语言实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct LNode { int data; struct LNode *next; } LNode, *LinkList; // 删除单链表偶数节点 LinkList DeleteEvenNodes(LinkList &L) { LNode *p = L; LNode *q; // 处理头节点偶数的情况 while (p->next != NULL && p->next->data % 2 == 0) { q = p->next; p->next = q->next; free(q); } p = p->next; LNode *prev = L; while (p != NULL) { if (p->data % 2 == 0) { q = p; prev->next = p->next; p = p->next; free(q); } else { prev = p; p = p->next; } } return L; } // 创建单链表(简单示例,头插法) LinkList CreateList() { LinkList L = (LinkList)malloc(sizeof(LNode)); L->next = NULL; int n; printf("请输入节点个数:"); scanf("%d", &n); for (int i = 0; i < n; i++) { LNode *s = (LNode *)malloc(sizeof(LNode)); printf("请输入第 %d 个节点的值:", i + 1); scanf("%d", &s->data); s->next = L->next; L->next = s; } return L; } // 遍历单链表 void TraverseList(LinkList L) { LNode *p = L->next; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { LinkList L = CreateList(); printf("原始链表:"); TraverseList(L); L = DeleteEvenNodes(L); printf("删除偶数节点后的链表:"); TraverseList(L); return 0; } ``` 该代码首先创建了一个单链表,然后遍历链表删除其中值为偶数节点,最后输出删除偶数节点后的链表
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值