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;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值