C语言双向链表(创建、插入、遍历、删除)

本文详细介绍了双向链表的各种操作,包括创建头节点、插入、删除、遍历等,并提供了完整的代码实现。通过本文,读者可以深入理解双向链表的工作原理和使用方法。
#ifndef DLIST_H
#define DLIST_H
typedef struct NODE
{
    int data;
    struct NODE *pre;
    struct NODE *next;
}node;

node *createhead(void);
node *createnode(int data);
void insertbyhead(node* head, int data);
int isemptylist(node* head);
void travellistforward(node* head);
void travellistopposite(node* head);
int getlenlist(node *head);
void insertdatalist(node* head, int data, int pos);
void deleteposlist(node* head, int pos);
int finddatalist(node* head, int data);
void destorylist(node *head);
#endif // DLIST_H
#include <stdio.h>
#include <stdlib.h>
#include "dlist.h"

node *createhead(void)
{
    node *head = (node*)malloc(sizeof (node));
    head->data = NULL;
    head->next = head;
    head->pre = head;
    return head;
}

node *createnode(int data)
{
    node *newnode = (node*)malloc(sizeof (node));
    newnode->data = data;
    newnode->pre = NULL;
    newnode->next = NULL;
    return newnode;
}

void insertbyhead(node* head, int data)
{
    node *newnode = createnode(data);
    newnode->next = head->next;
    head->next = newnode;
    newnode->next->pre = newnode;
    newnode->pre = head;
}

int isemptylist(node *head)
{
    if(head->next == NULL) return 1;
    return 0;
}

void travellistforward(node *head)
{
    if(isemptylist(head)) return;
    node *p;
    p = head->next;
    while (p != head) {
        printf("%d\n", p->data);
        p = p->next;
    }
}

void travellistopposite(node *head)
{
    if(isemptylist(head)) return;
    node *p;
    p = head->pre;
    while (p != head) {
        printf("%d\n", p->data);
        p = p->pre;
    }
}

int getlenlist(node *head)
{
    if(isemptylist(head)) return 0;
    node *p;
    int len = 0;
    p = head->next;
    while (p != head) {
        p = p->next;
        len++;
    }
    return len;
}

void insertdatalist(node* head, int data, int pos)
{
    if(pos > getlenlist(head)) return;
    node *newnode = createnode(data);
    node *p = head;
    int i = 0;
    while (i != pos) {
        p = p->next;
        i++;
    }
    newnode->next = p->next;
    p->next = newnode;
    newnode->next->pre = newnode;
    newnode->pre = p;
}

void deleteposlist(node* head, int pos)
{
    if(pos > getlenlist(head)) return;
    node *p = head;
    int i = 0;
    while (i != pos) {
        p = p->next;
        i++;
    }
    p->pre->next = p->next;
    p->next->pre = p->pre;
    free(p);
}


int finddatalist(node* head, int data)
{
    int pos = 1;
    node *p = head->next;
    while (p != head) {
        if(p->data == data) return pos;
        p = p->next;
        pos++;
    }
    return 0;
}

void destorylist(node *head)
{
    node *p = head->next;
    node *temp;
    head->pre = head;
    head->next = head;
    while (p->next != head) {
        temp = p;
        p->pre = NULL;
        p = p->next;
        free(temp);
    }
    p->next = NULL;
    p->pre = NULL;
    free(p);
}
#include <stdio.h>
#include "dlist.h"

int main(int argc, char *argv[])
{
    node *L = createhead();
    insertbyhead(L, 11);
    insertbyhead(L, 8);
    insertbyhead(L, 40);
    insertbyhead(L, 30);
    insertbyhead(L, 60);
    insertbyhead(L, 3);
    insertbyhead(L, 100);
    travellistforward(L);
//    travellistopposite(L);
    insertdatalist(L, 3, 555);
    int len = getlenlist(L);
    printf("len=%d\n", len);
    deleteposlist(L, 2);
    travellistforward(L);
//    travellistopposite(L);
    len = getlenlist(L);
    printf("len=%d\n", len);
    return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值