ds_day04

作业

题目

  1. 单链表按位置修改
  2. 单链表按元素删除
  3. 单链表按元素修改
  4. 单链表空间释放

结果

在这里插入图片描述

代码

main

#include "head.h"

int main(int argc, char const *argv[])
{
    // 创建单链表
    PLinkedList list = list_create();

    // 尾插
    for (int i = 0; i < 5; i++){
        list_insert_rear(list,(DataType)(i+1)*3);
    }
    // 头插
    for (int i = 0; i < 5; i++){
        list_insert_head(list,(DataType)(i+1)*4);
    }
    printf("初始单链表\n");
    list_to_string(list);

    /********************************
    *   作业1:单链表按位置修改
    *********************************/
    printf("位置3的元素修改为333\n");
    DataType elem = 333;
    list_modify_index(list,3,elem);
    list_to_string(list);

    /********************************
    *   作业2:单链表按元素删除
    *********************************/
    printf("删除元素15\n");
    elem = 15;
    list_delete_elem(list,elem);
    list_to_string(list);

    /********************************
    *   作业3:单链表按元素修改
    *********************************/
    printf("修改元素16为666\n");
    list_modify_elem(list,16,666);
    list_to_string(list);
    
    /********************************
    *   作业4:单链表释放
    *********************************/
    list = list_free(list);
    printf("单链表释放后\n");
    list_to_string(list);

    return 0;
}

head.h

#if !defined(_HEAD_H_)
#define _HEAD_H_

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

typedef int DataType;

typedef struct Node{
    union {
        //数据域
        DataType data;
        int len;
    };
    //指针域
    struct Node *next;
}*PLinkedList, *PNode, Node;

// 创建单链表
PLinkedList list_create();
// 创建节点
PNode list_create_node();
// 尾插
int list_insert_rear(PLinkedList l,DataType e);
// 头插
int list_insert_head(PLinkedList l,DataType e);
// 遍历
int list_to_string(PLinkedList l);
// 按位置修改
int list_modify_index(PLinkedList l,int pos,DataType e);
// 按位置删除
int list_delete_index(PLinkedList l,int pos);
// 按元素查找
int list_search_elem(PLinkedList l,DataType e);
// 按元素删除
int list_delete_elem(PLinkedList l,DataType e);
// 按元素修改
int list_modify_elem(PLinkedList l,DataType e,DataType val);
// 尾删
int list_delete_rear(PLinkedList l);
// 空间释放
PLinkedList list_free(PLinkedList l);

#endif // _HEAD_H_

func.c

#include "head.h"

/*
* 创建节点
* @return  成功节点  失败NULL
*/
PNode list_create_node(){
    PNode node = (PNode)malloc(sizeof(Node));
    if(!node){
        return NULL;
    }
    return node;
}

/*
* 创建单链表
* @return  成功头节点  失败NULL
*/
PLinkedList list_create(){
    PNode l =  list_create_node();

    if (!l){
        return NULL;
    }
    
    l->len = 0;
    l->next = NULL;

    return l;
}


/*
* 尾插
* @param   l  单链表
* @param   e  要插入的元素
* @return  成功0    失败-1
*/
int list_insert_rear(PLinkedList l,DataType e){
    // 判头节点存在
    if(!l){
        return -1;
    }

    // 创建节点
    PNode node = list_create_node();
    if(!node){
        return -1;
    }
    node->data = e;
    node->next = NULL;

    // 移动到最后一个节点,连接节点
    PLinkedList p=l;
    while(p->next){
        p = p->next;
    }
    p->next = node;
    l->len++;
}

/*
* 头插
* @param   l  单链表
* @param   e  要插入的元素
* @return  成功0    失败-1
*/
int list_insert_head(PLinkedList l,DataType e){
    // 判头节点存在
    if(!l){
        return -1;
    }

    // 创建节点
    PNode node = list_create_node();
    if(!node){
        return -1;
    }
    node->data = e;
    node->next = l->next;

    // 连接节点
    l->next = node;
    l->len++;
}


/*
* 遍历
* @param   l  单链表
* @return  成功0    失败-1
*/
int list_to_string(PLinkedList l){
    // 判头节点
    if(!l){
        return -1;
    }

    // 遍历
    while (l->next){
        l = l->next;
        printf("%d  ",l->data);
    }
    putchar('\n');

    return 0;
}


int list_modify_index(PLinkedList l,int pos,DataType e){
    // 判头节点、判空
    if(!l || !l->next){
        return -1;
    }
    
    // 判下标合法
    if (pos < 0 || pos > l->len + 1){
        return -1;
    }
    
    // 移动到目标节点
    PNode target = l;
    for (int i = 0; i < pos; i++){//0 头节点
        target = target->next;
    }
    
    // 修改数据
    target->data = e;

    return 0;
}

/*
* 按元素查询 
* @param   l  单链表
* @param   e  要查询的元素
* @return  成功 元素下标    失败-1
*/
int list_search_elem(PLinkedList l,DataType e){
    // //判头节点、判空
    if(!l || !l->next){
        return -1;
    }

    // //遍历返回下标
    int index = 0;
    while (l->next){
        l = l->next;
        index++;
        if(l->data == e){
            return index;
        }
    }

    return -1;
}


/*
* 按位置删除 
* @param   l  单链表
* @param   pos  要删除的元素的下标
* @return  成功0    失败-1
*/
int list_delete_index(PLinkedList l,int pos){
    //判头节点、判空
    if(!l || !l->next){
        return -1;
    }
    // // 判下标合法
    if (pos < 0 || pos > l->len){
        return -1;
    }

    // 获取要删除的节点
    PNode pre_targe = l;
    for (int i = 0; i < pos-1; i++){
        pre_targe = pre_targe->next;
    }
    PNode targe = pre_targe->next;

    // 删除
    pre_targe->next = targe->next;
    free(targe);
    targe = NULL;

    return 0;
}

/*
* 按元素删除 
* @param   l  单链表
* @param   e  要删除的元素
* @return  成功0    失败-1
*/
int list_delete_elem(PLinkedList l,DataType e){
    //判头节点、判空
    // if(!l || !l->next){
    //     return -1;
    // }
    
    // 获取元素下标
    int index = list_search_elem(l,e);
    
    // 按下标删除
    list_delete_index(l,index);

    return 0;
}

int list_modify_elem(PLinkedList l,DataType e,DataType val){
    //判头节点、判空
    if(!l || !l->next){
        return -1;
    }

    //获取元素下标
    int index = list_search_elem(l,e);

    // 按下标修改元素
    list_modify_index(l,index,val);

    return 0;
} 

/*
* 尾删 
* @param   l  单链表
* @return  成功0    失败-1
*/
int list_delete_rear(PLinkedList l){
    //判空、判头节点
    if(!l || !l->next){
        return -1;
    }

    //移动到倒数第二个节点
    PNode pre_end = l;
    while (pre_end->next->next){
        pre_end = pre_end->next;
    }
    
    //删除最后一个节点
    free(pre_end->next);
    pre_end->next = NULL;

    return 0;
}

/*
* 空间释放 
* @param   l  单链表
* @return  NULL
*/
PLinkedList list_free(PLinkedList l){
    // 判断头节点、判空
    if(!l || !l->next){
        return NULL;
    }

    // 删除全部节点
    for (int i = 1; i < l->len; i++){
        list_delete_rear(l);
    }

    // 释放头节点
    free(l);

    return NULL;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值