c实现功能(13)实现单向链表的简要功能

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

//利用结构体创建节点
struct list{
    //创建数据域
    int data;
    //创建指针域
    struct list *next;
};

//实现建立一个节点的方法
struct list *create_list(){
    return calloc(sizeof (struct list), 1);
}

//循环遍历链表
void traverse(struct list *ls){
    struct list *p = ls;

    while(p){
        printf("%d\n", p->data);
        p = p->next;
    }
}

//在指定的位置插入元素
struct list *insert_list(struct list *ls, int n, int data){
    struct list *p = ls;
    //这里做的是遍历到要插入的节点
    while (p && n--) {
        p = p->next;
    }
    //说明n大于链表的节点数
    if(p == NULL){
        return NULL;
    }

    //建立一个新的节点
    struct list *node = create_list();
    node->data = data;
    //先后再前
    node->next = p->next;
    p->next = node;
}

//删除指定位置的元素
int delete_list(struct list *ls, int n){
    struct list *p = ls;
    while(p && n--){
        p = p->next;
    }

    if(p == NULL){
        //n的位置不合适
        return -1;
    }

    struct list *temp = p->next;
    p->next = p->next->next;
    free(temp);

    return 0;
}

//返回链表元素的个数
int count_list(struct list *ls){
    struct list *p = ls;
    int count = 0;
    while(p){
        count++;
        p = p->next;
    }

    return count;
}

//清空链表,只保留首节点
void clear_list(struct list *ls){
    //因为要保留首节点,所以起始的位置为第二个节点
    struct list *p = ls->next;
    while(p){
        struct list *temp = p->next;
        free(p);
        p = temp;
    }

    //将首节点的下一个节点设置为null
    ls->next = NULL;
}

//查看链表是否为空
int empty_list(struct list *ls){
    if(ls->next){
        return 0;
    }else{
        return -1;
    }
}

//返回链表指定位置的节点
struct list *locale_list(struct list *ls, int n){
    struct list *p = ls;
    while(p && n--){
        p = p->next;
    }

    if(p == NULL){
        return NULL;
    }

    return p;
}

//通过数据域寻找指针域,返回节点在链表中的位置
int data_list(struct list *ls, int data){
    int index = 1;
    struct list *p = ls;
    while(p){
        if(p->data == data){
            return index;
        }else{
            p = p->next;
        }
        index++;
    }

    return 0;
}

//得到最后一个节点
struct list *last_list(struct list *ls){
    struct list *p = ls;
    while(p->next){
        p = p->next;
    }

    return p;
}

//合并两个链表,但不合并链表头
void merge_list(struct list *ls1, struct list *ls2){
    last_list(ls1)->next = ls2->next;
    //链表头并不合并
    free(ls2);
}

int main(void){
    //在堆中创建一个节点
    struct list *first = create_list();
    struct list *second = create_list();
    struct list *third = create_list();

    first->next = second;
    second->next = third;
    third->next = NULL;

    first->data = 1;
    second->data = 2;
    third->data = 3;

    //测试遍历链表
    traverse(first);
    printf("---------------------\n");

    //测试插入数据
    insert_list(first, 1, 4);
    traverse(first);
    printf("---------------------\n");

    //测试删除元素
    delete_list(first, 1);
    traverse(first);
    printf("---------------------\n");

    //测试返回元素的个数
    int count = count_list(first);
    printf("测试返回元素的个数: %d\n", count);
    printf("---------------------\n");

    //测试返回指定位置的节点
    struct list *p = locale_list(first, 1);
    printf("测试返回指定位置的节点: %d\n", p->data);
    printf("---------------------\n");

    //测试通过数据域查找指针域
    if(data_list(first, 1)){
        printf("Find\n");
    }else{
        printf("Not Find\n");
    }
    printf("%d\n", data_list(first, 4));
    printf("---------------------\n");

    //测试得到最后一个节点
    printf("最后一个节点: %d\n", last_list(first)->data);
    printf("---------------------\n");

    //测试清空链表
    clear_list(first);
    traverse(first);
    printf("---------------------\n");

    //测试合并两个链表
    struct list *first2 = create_list();
    for(int i = 0; i < 10; i++){
        insert_list(first, 0, i);
    }

    merge_list(first, first2);
    traverse(first);
    printf("---------------------\n");

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值