关于单链表的一些练习

一、在单链表中删除所有值为x的结点,输出删除后的单链表
二、逆置单链表

一、

  1. delete.c
#include<stdio.h>
#include<stdlib.h>
#include"delete.h"

Node *create()
{
    Node *first = NULL;
    Node *last = NULL;
    element x;
    printf("请输入数据,0为结束标志。");
    while(1)
    {
        scanf("%d",&x);
        if(x == 0)
        {
            break;
        }
        Node *p = (Node *)malloc(sizeof(Node));
        p->data = x;
        p->next = NULL;
        if(first == NULL)
        {
            first = p;
            last = p;
        }
        else
        {
            last->next = p;
            last = p;
        }
    }
    return first;
}
/*
	功能:删除单链表中所有为x的结点
	参数:@h:指向第一个结点的指针;@x:要删除的数据
	返回值:指向第一个结点的指针
*/
Node *delete(Node *h,element x)
{
    Node *p = NULL;
    if(h == NULL)
    {
        return NULL;
    }
    if(h->data != x)
    {
        h->next = delete(h->next,x);
        return h;
    }
    else
    {
        p = h;
        h = h->next;
        p->next = NULL;
        free(p);
        return delete(h,x);
    }
}

void printlist(Node *first)
{
    Node *p = first;
    printf("链表中结点的值依次是:\n");
    while(p)
    {
        printf("%d",p->data);
        p = p->next;
    }
    printf("\n")}
  1. delete.h
#ifndef __DELETE_H__
#define __DELETE_H__
#define element x

typedef struct node
{
    element data;
    struct node *next;
}Node;

Node *create();
Node *delete(Node *h,element x);
void printlist(Node *first);

#endif
  1. main.c
#include<stdio.h>
#include"delete.h"

int main()
{
    Node *first = create();
    printflist(first);
    element x;
    printf("请输入要删除的数据:\n");
    scanf("%d",&x);
    first = delete(first,x);
    printflist(first);
    return 0;
}

二、原地逆置单链表,即不再重新分配内存空间

  1. reverse.c
#include<stdio.h>
#include<stdlib.h>
#include"reverse.h"

Node *create()
{
    Node *first = NULL;
    Node *last = NULL;
    element x;
    printf("请输入数据,0为结束标志。");
    while(1)
    {
        scanf("%d",&x);
        if(x == 0)
        {
            break;
        }
        Node *p = (Node *)malloc(sizeof(Node));
        p->data = x;
        p->next = NULL;
        if(first == NULL)
        {
            first = p;
            last = p;
        }
        else
        {
            last->next = p;
            last = p;
        }
    }
    return first;
}
/*
	功能:逆置单链表
	参数:@h:指向第一个结点的指针
	返回值:指向第一个结点的指针
*/
Node *reverse(Node *h)
{
    Node *first = NULL;
    Node *p = NULL;
    while(h)
    {
        p = h;
        h = h->next;
        p->next = NULL;
        if(first == NULL)
        {
            first = p;
        }
        else
        {
            p->next = first;
            first = p;
        }
    }
    return first;
}

void printlist(Node *first)
{
    Node *p = first;
    printf("链表中结点的值依次是:\n");
    while(p)
    {
        printf("%d",p->data);
        p = p->next;
    }
    printf("\n")}
  1. reverse.h
#ifndef __REVERSE_H__
#define __REVERSE_H__
#define element x;

Node *create();
Node *reverse(Node *h);
void printlist(Node *first);

#endif
  1. main.c
#include<stdio.h>
#include"reverse.h"
int main()
{
    Node *first = create();
    printflist(first);
    first = reverse(first);
    printflist(first);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值