双向循环链表的创建
1 节点的创建
struct node
{
dataType data;
struct node *prev;
struct node *next;
};
2 管理结构体
struct headNode
{
struct node *first;
struct node *last;
dataType nodeNumder;
};
3 主代码(可运行)
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
typedef int dataType;
struct node
{
dataType data;
struct node *prev;
struct node *next;
};
struct headNode
{
struct node *first;
struct node *last;
dataType nodeNumder;
};
void *addHead(struct headNode *head,struct node *pnew)
{
pnew->next=head->first;
pnew->prev=head->first->prev;
head->first->prev=pnew;
head->first=pnew;
}
void addTail(struct headNode *head,struct node *pnew)
{
pnew->prev = head->last;
head->last->next = pnew;
head->last = pnew;
}
struct headNode *init_headNode()
{
struct headNode *head=malloc(sizeof(struct headNode));
if(head == NULL)
{
perror("create head failed:");
return NULL;
}
head->first=NULL;
head->last=NULL;
head->nodeNumder=0;
return head;
}
struct node *create_newNode(dataType data)
{
struct node *pnew=malloc(sizeof(struct node));
if(pnew == NULL)
{
perror("create new node failed:");
return NULL;
}
pnew->data=data;
pnew->prev=NULL;
pnew->next=NULL;
return pnew;
}
struct headNode *create_list()
{
struct headNode *head=init_headNode();
if(head==NULL)
{
printf("over\n");
}
while (1)
{
dataType data;
scanf("%d",&data);
if(data==0)
break;
struct node *pnew=create_newNode(data);
if(head->first==NULL)
{
head->first=pnew;
head->last=pnew;
}
else
{
addTail(head,pnew);
}
head->nodeNumder++;
}
if(head->nodeNumder != 0)
{
head->last->next = head->first;
head->first->prev = head->last;
}
return head;
}
void showList(struct headNode* head)
{
if(head->nodeNumder == 0)
{
printf("链表为空\n");
return;
}
struct node *p=head->first;
int n=head->nodeNumder;
while (n--)
{
printf("%d\t",p->data);
p=p->next;
}
printf("\n");
printf("链表节点数为:%d\n",head->nodeNumder);
}
struct headNode *del_node(struct headNode *head,dataType data)
{
int n=head->nodeNumder;
struct node *p = head->first;
while(n!=0)
{
if(p->data == data)
{
break;
}
else
p = p->next;
n--;
}
if(n==0)
{
printf("没有找到\n");
}
else if(p->next==head->first)
{
p->prev->next = NULL;
p->prev = NULL;
free(p);
head->nodeNumder--;
}
else if(head->first->data == data)
{
head->first = p->next;
p->next = NULL;
p->prev = NULL;
free(p);
head->nodeNumder--;
}
else
{
p->prev->next = p->next;
p->next->prev = p->prev;
p->next = NULL;
p->prev = NULL;
head->nodeNumder--;
free(p);
}
return head;
}
struct headNode *add_node_list(struct headNode *head,dataType newData,dataType data)
{
struct node *pnew=create_newNode(newData);
int n=head->nodeNumder;
struct node *p=head->first;
while(n!=0)
{
if(p->data==data)
break;
p=p->next;
n--;
}
if(n==0)
{
addTail(head,pnew);
}
else if(p->data==head->first->data)
{
addHead(head,pnew);
}
else
{
pnew->next=p;
pnew->prev=p->prev;
p->prev->next = pnew;
p->prev = pnew;
}
head->nodeNumder++;
return head;
}
struct headNode *updata_node(struct headNode *head,dataType data1,dataType data2)
{
struct node *p=head->first;
while (p->next!=head->first)
{
if(p->data==data1)
{
p->data=data2;
}
p=p->next;
}
}
struct headNode *destory(struct headNode *head)
{
if(head==NULL)
{
printf("链表为空\n");
free(head);
}
struct node *temp=NULL;
struct node *p=head->first;
int n=head->nodeNumder;
while (n--)
{
temp=p->next;
p->next=NULL;
free(p);
head->nodeNumder--;
}
return head;
}
bool judge_circle(struct headNode *head)
{
struct node *fast=head->first;
struct node *slow=head->first;
do
{
fast=fast->next;
if(fast!=NULL)
{
fast=fast->next;
}
else
{
return false;
}
slow=slow->next;
} while (fast!=NULL&&slow!=NULL&&fast!=slow);
return fast==slow;
}
int main(int argc, char const *argv[])
{
struct headNode *head = create_list();
if(head==NULL)
{
printf("创建链表失败");
return -1;
}
del_node(head,2);
showList(head);
return 0;
}