C language doubly linked list (create, insert, traverse, delete)

#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;
}

Guess you like

Origin blog.csdn.net/cp_srd/article/details/105497307