双向链表的头插,尾插,头删,尾删
头文件:(head.h)
#include <string.h>
#include <stdlib.h> typedef char datatype;
typedef struct node
{ datatype data; struct node* next; struct node* prev;
}*Doublelink; Doublelink Create_node(); Doublelink insert(Doublelink head,datatype element); void show(Doublelink head); Doublelink head_delete(Doublelink head); Doublelink tail_insert(Doublelink head,datatype element); Doublelink tail_delete(Doublelink head); #endif
test.c
#include"head.h"
int main(int argc, const char *argv[])
{ Doublelink head=NULL; int n; datatype element; printf("请输入要插入数据的个数:"); scanf("%d",&n); for(int i=0;i<n;i++) { printf("请输入插入的数据:"); // scanf(" %c",&element); getchar(); element=getchar(); head=insert(head,element);//头插 } head=head_delete(head); //头删 show(head); //遍历 printf("请输入尾插插入的个数:"); scanf("%d",&n); for(int i=0;i<n;i++) { printf("请输入插入的数据:"); // scanf(" %c",&element); getchar(); element=getchar(); head=tail_insert(head,element);//尾插 } head=tail_delete(head); show(head); return 0;
}
main.c
#include"head.h" Doublelink Create_node()
{ Doublelink s=(Doublelink)malloc(sizeof(struct node));if(NULL==s) return NULL; s->data=0; s->next=s->prev=NULL; return s;
} //头插
Doublelink insert(Doublelink head,datatype element)
{ Doublelink s=Create_node(); s->data=element; if(NULL==head) { head=s; } else { s->next=head; head->prev=s; head=s; } return head;
}
//遍历
void show(Doublelink head)
{ if(NULL==head) { return;} //正向遍历 Doublelink p=head; while(p->next!=NULL) { printf("%c\t",p->data); p=p->next; } printf("%c\n",p->data); //反向遍历
/* while(p!=NULL) { printf("%c\t",p->data); p=p->prev; }
*/
} //头删
Doublelink head_delete(Doublelink head)
{ //判断链表是否为空 if(NULL==head) { return head; } //链表存在多个节点 Doublelink del=head; head=head->next; free(del); del=NULL; return head;
} //尾插
Doublelink tail_insert(Doublelink head,datatype element)
{ Doublelink s=Create_node(); s->data=element; //链表为空 if(NULL==head) { head=s; return head; } //链表节点个数>=1 Doublelink p=head; while(p->next!=NULL) { p=p->next; } p->next=s; s->prev=p; return head;
} //尾删
Doublelink tail_delete(Doublelink head)
{ if(NULL==head) { return head; } Doublelink p=head; while(p->next!=NULL) { p=p->next; } if(p->prev!=NULL) { p->prev->next=NULL; } free(p); p=NULL; return head;
}
双向循环链表的头插,头删,尾插,尾删
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h> typedef char datatype;
typedef struct node
{ datatype data; struct node* next; struct node* prev;
}*Doublelink; Doublelink Create_node(); Doublelink insert(Doublelink head,datatype element); void show(Doublelink head); Doublelink head_delete(Doublelink head); Doublelink tail_insert(Doublelink head,datatype element); Doublelink tail_delete(Doublelink head); #endif
test.c
#include"head.h"
int main(int argc, const char *argv[])
{ Doublelink head=NULL; int n; datatype element; printf("请输入要插入数据的个数:"); scanf("%d",&n); for(int i=0;i<n;i++) { printf("请输入插入的数据:"); // scanf(" %c",&element); getchar(); element=getchar(); head=insert(head,element);//头插 } head=head_delete(head); //头删 show(head); //遍历 printf("请输入尾插插入的个数:"); scanf("%d",&n); for(int i=0;i<n;i++) { printf("请输入插入的数据:"); // scanf(" %c",&element); getchar(); element=getchar(); head=tail_insert(head,element);//尾插 } head=tail_delete(head); show(head); return 0;
}
main.c
#include"head.h" Doublelink Create_node()
{ Doublelink s=(Doublelink)malloc(sizeof(struct node)); if(NULL==s) return NULL; s->data=0; s->next=s->prev=s; return s;
} //头插
Doublelink insert(Doublelink head,datatype element)
{ //创建节点 Doublelink s=Create_node(); s->data=element; //链表为空链表 if(NULL==head) { head=s; } //链表节点数>=1 else { Doublelink real=head->prev; s->next=head; head->prev=s; head=s; real->next=head; head->prev=real; } return head;
}
//遍历
void show(Doublelink head)
{ if(NULL==head) { return; } //正向遍历 Doublelink p=head; while(p->next!=head) { printf("%c\t",p->data); p=p->next; } printf("%c\n",p->data);
}
//头删
Doublelink head_delete(Doublelink head)
{ //判断链表是否为空 if(NULL==head) { return head; } //链表存在多个节点 Doublelink p=head; //找到最后一个节点的位置 while(p->next!=head) { p=p->next; } Doublelink del=head; head=head->next; //连接头尾,让链表重新循环 p->next=head; head->prev=p; free(del); del=NULL; return head;
}
//尾插
Doublelink tail_insert(Doublelink head,datatype element)
{ //创建节点 Doublelink s=Create_node(); s->data=element; //链表为空 if(NULL==head) { head=s; return head; } //链表节点个数>=1 Doublelink p=head; while(p->next!=head) { p=p->next; } p->next=s; //连接表头和表尾 s->next=head; head->prev=s; return head;
}
//尾删
Doublelink tail_delete(Doublelink head)
{ //判断链表是否为空 if(NULL==head) { return head; } Doublelink p=head; p=head->prev; //如果链表只有一个节点 if(head->next==head) { free(p); return NULL; } //删除尾节点 p->prev->next=head; head->prev=p->prev; free(p); p=NULL; return head;
}