#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
#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);
insertdatalist(L, 3, 555);
int len = getlenlist(L);
printf("len=%d\n", len);
deleteposlist(L, 2);
travellistforward(L);
len = getlenlist(L);
printf("len=%d\n", len);
return 0;
}