双向链表创建节点、遍历、头插、尾插、头删、尾删、逆置
mian.c
#include"head.h"
int main(int argc, const char *argv[])
{
Doublelink L=NULL;
int n;
datatype e;
printf("please enter n");
scanf("%d",&n);
for(int i=0;i<n;i++){
printf("please enter e");
scanf("%s",e);
L=insert_head(e,L);
}
printf("please enter n");
scanf("%d",&n);
for(int i=0;i<n;i++){
printf("please enter e");
scanf("%s",e);
L=insert_rear(e,L);
}
L=delete_head(L);
L=delete_rear(L);
output(L);
L=nizhi(L);
output(L);
return 0;
}
test.c
#include"head.h"
Doublelink create_node(){
Doublelink node=(Doublelink)malloc(sizeof(struct Node));
if(node==NULL)
return NULL;
strcpy(node->data,"");
node->next=NULL;
node->prev=NULL;
return node;
}
Doublelink insert_head(datatype e,Doublelink L){
Doublelink s=create_node();
if(s==NULL)
return L;
strcpy(s->data,e);
if(NULL!=L)
{
s->next=L;
L->prev=s;
}
L=s;
return L;
}
void output(Doublelink L){
if(L==NULL)
return ;
puts("正向遍历");
while(L->next!=NULL){
printf("%s ",L->data);
L=L->next;
}
printf("%s ",L->data);
printf("\n");
puts("反向遍历");
while(L!=NULL){
printf("%s ",L->data);
L=L->prev;
}
puts("");
}
Doublelink insert_rear(datatype e,Doublelink L){
Doublelink s=create_node();
if(NULL==s)
return L;
strcpy(s->data,e);
if(NULL==L){
L=s;
return L;}
Doublelink rear=L;
while(rear->next!=NULL){
rear=rear->next;
}
rear->next=s;
s->prev=rear;
return L;
}
Doublelink delete_head(Doublelink L){
if(NULL==L)
return L;
if(L->next==NULL){
free(L);
L=NULL;
return L;
}
Doublelink q=L->next;
strcpy(L->data,q->data);
L->next=q->next;
if(q->next!=NULL)
q->next->prev=L;
free(q);
q=NULL;
return L;
}
Doublelink delete_rear(Doublelink L){
if(L==NULL)
return L;
if(L->next==NULL){
free(L);
L=NULL;
return L;
}
Doublelink rear=L;
while(rear->next!=NULL)
rear=rear->next;
rear->prev->next=NULL;
free(rear);
rear=NULL;
return L;
}
Doublelink nizhi(Doublelink L){
if(L==NULL||L->next==NULL)
return L;
Doublelink p=L->next;
L->next=NULL;
while(p!=NULL){
Doublelink t=p;
p=p->next;
t->next=L;
L->prev=t;
t->prev=NULL;
L=t;
}
return L;
}
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef char datatype[20];
typedef struct Node
{
datatype data;
struct Node *next;
struct Node *prev;
}*Doublelink;
Doublelink insert_head();
void output();
Doublelink insert_rear();
Doublelink delete_head();
Doublelink delete_rear();
Doublelink nizhi();
#endif