5/18 C语言实现双向链表的增删改查等操作

 C语言实现双向链表的增删改查等操作


head.h 

/* 
   ---------------------------------
    @author:YoungZorn
    created on 2023/5/18 13:53.
   ---------------------------------
*/


#ifndef LINKLIST_BIDIRECTIONAL_H
#define LINKLIST_BIDIRECTIONAL_H

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef char datatype;
typedef struct Node{
    union {
        int len;
        datatype data;
    };
    struct Node *next;
    struct Node *prev;
}*double_linklist;

double_linklist create(int flag);//创建头节点
int insertOnHead(double_linklist L,datatype e); //头插
void output(double_linklist L); //循环遍历
int insertOnRear(double_linklist L,datatype e); //尾插
int deleteOnHead(double_linklist L); //头删
int deleteOnRear(double_linklist L); //尾删
int insertByPos(double_linklist L,int index,datatype e);//按位置插入
int deleteByPos(double_linklist L,int index);           //按位置删除
int updateByPos(double_linklist L,int index,datatype e);//按位置修改
int searchByPos(double_linklist L,int index);//按位置查找

#endif //LINKLIST_BIDIRECTIONAL_HEAD_H

 func.c

/* 
   ---------------------------------
    @author:YoungZorn
    created on 2023/5/18 13:53.
   ---------------------------------
*/
#include "head.h"
double_linklist create(int flag){
    double_linklist L = (double_linklist) malloc(sizeof(struct Node));
    if (L == NULL){
        return NULL;
    }
    L->next = NULL;
    L->prev = NULL;
    if (flag = 1) {
        L->len = 0;
    } else{
        L->data = ' ';
    }

    return L;
}

int insertOnHead(double_linklist L,datatype e){
    if (L == NULL){
        return -1;
    }
    double_linklist p = L;
    double_linklist s = create(0);
    if (s == NULL){
        return -1;
    }
    s->data = e;
    s->prev = p;
    s->next = p->next;
    if (L->next != NULL){
        s->next->prev = p;
    }
    p->next = s;
    L->len++;

    return 0;
}

void output(double_linklist L){
    if (L == NULL || L->next ==NULL){
        printf("EMPTY LIST\n");
        return;
    }
    puts("Forward output:");
    double_linklist p = L;
    while (p->next != NULL){
        p = p->next;
        printf("%c\t",p->data);
    }
    /*puts(" ");
    puts("Reverse output:");
    while (p->prev != NULL){
        printf("%c\t",p->data);
        p = p->prev;
    }*/
    puts(" ");
}

int insertOnRear(double_linklist L,datatype e){  //尾插
    if (L == NULL){
        return -1;
    }
    double_linklist p = L;
    while (p->next != NULL){
        p = p->next;  //p走到最后一个节点所在位置
    }
    double_linklist s = create(0);
    s->data = e;
    p->next = s;
    s->prev = p;
    L->len++;

    return 0;
}

int deleteOnHead(double_linklist L){  //头删
    if (L == NULL || L->next== NULL){
        printf("EMPTY LIST\n");
        return -1;
    }
    double_linklist q = L->next;
    L->next = q->next;
    if (q->next!=NULL){
        q->next->prev = L;
    }
    free(q);
    q = NULL;
    L->len--;
}

int deleteOnRear(double_linklist L){  //尾删
    if (L == NULL || L->next== NULL){
        printf("EMPTY LIST\n");
        return -1;
    }
    double_linklist p = L;
    while (p->next !=NULL){
        p = p->next;
    }
    p->prev->next = NULL;
    free(p);
    p = NULL;
    L->len--;

    return 0;
}

int insertByPos(double_linklist L,int index,datatype e){
    if (L == NULL || index<0 || index>=L->len){
        printf("INSERT ERROR\n");
        return -1;
    }
    double_linklist p = L;
    double_linklist s = create(0);
    s->data = e;
    int count = 0;
    while (p->next != NULL){
        if (count == index){
            insertOnHead(p,e);
            break;
        }
        p = p->next;
        count++;
    }
    return 0;
}

int deleteByPos(double_linklist L,int index){  //按位置删除
    if (L == NULL || index<0 || index>=L->len){
        printf("DELETE ERROR\n");
        return -1;
    }
    double_linklist p = L;
    int count = 0;
    while (p->next != NULL){
        if (count == index){
            deleteOnHead(L);
            break;
        }
        p = p->next;
        count++;
    }
    return 0;
}

int updateByPos(double_linklist L,int index,datatype e){        //按位置修改
    if (L == NULL || index<0 || index>=L->len){
        printf("UPDATE ERROR\n");
        return -1;
    }
    double_linklist p = L;
    double_linklist s = create(0);
    s->data = e;
    int count = 0;
    while (p->next != NULL){
        if (count == index){
            p->next->data = s->data;
            break;
        }
        p = p->next;
        count++;
    }
    return 0;
}

int searchByPos(double_linklist L,int index){ //按位置查找
    if (L == NULL || index<0 || index>=L->len){
        printf("SEARCH ERROR\n");
        return -1;
    }
    double_linklist p = L;
    int count = 0;
    while (p->next != NULL){
        if (count == index){
            printf("EXIST:index[%d] = %c",count,p->data);
            break;
        }
        p = p->next;
        count++;
    }
    return 0;
}

 main.c

/* 
   ---------------------------------
    @author:YoungZorn
    created on 2023/5/18 13:53.
   ---------------------------------
*/
#include "head.h"
int main(){
    double_linklist L = create(1);
    int n;
    datatype e;
    printf("number of elements:");
    scanf("%d",&n);
    for (int i = 0; i < n; i++) {    //循环头插
        printf("value %d: ",i+1);
        scanf(" %c",&e);
        insertOnRear(L,e);
    }
    output(L);          //循环输出
//    deleteOnRear(L);
//    output(L);
//    insertByPos(L,4,'A');
//    output(L);
//    deleteByPos(L,0);
//    output(L);
//    updateByPos(L,2,'e');
//    output(L);
    searchByPos(L,3);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值