head.c
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
enum passble{FALSE=-1,SUCCESS};
typedef char datatype;
//双向链表节点结构体
typedef struct Node
{
//数据域:数据元素
datatype data;
//指针域:上一个节点的地址
struct Node *prev;
//指针域:下一个节点的地址
struct Node *next;
}*Doublelink;
Doublelink insert_head();
Doublelink create_node();
void output();
Doublelink head_delete();
Doublelink tail_insert();
Doublelink tail_delete();
#endif
main.c
#include "head.h" |
int main(int argc, const char *argv[]) |
{ |
Doublelink head=NULL; //定义双向链表头节点 |
int n; |
printf("please enter n:"); |
scanf("%d",&n); |
datatype element; |
for(int i=0;i<n;i++) |
{ |
printf("please enter %d element:",i+1); |
//scanf("%c",&element); |
getchar(); |
element=getchar(); |
head=insert_head(element,head); |
} |
|
output(head); |
|
head=head_delete(head); |
output(head); |
|
printf("input the element you want to insert into tail"|
element = getchar(); |
head = tail_insert(element, head); |
output(head); |
|
|
head = tail_delete(head); |
output(head); |
return 0; |
} |
|
test.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_head(datatype element,Doublelink head)
{
//创建一个新节点
Doublelink s=create_node();
s->data=element;
//1.链表为空
if(NULL==head){
head=s;
}
else
{
//2.链表存在多个节点>=1
s->next=head;
head->prev=s;
head=s;
}
return head;
}
void output(Doublelink head)
{
//1.判断链表是否为空
if(NULL==head)
return;
//2.正向遍历
Doublelink p=head;
while(p->next!=NULL)//最后一个节点的数据域不打印
{
printf("%c ",p->data);
p=p->next;
}
printf("%c\n",p->data);
//逆向遍历
while(p!=NULL)
{
printf("%c ",p->data);
p=p->prev;
}
putchar(10);
}
Doublelink head_delete(Doublelink head)
{
//1.判断链表是否为空
if(NULL==head)
{
return head;
}
//2.链表存在多个节点 >=1
Doublelink del=head;
head=head->next;
free(del);
del=NULL;
return head;
}
Doublelink tail_insert(datatype element, Doublelink head){
Doublelink p = head;
Doublelink s = create_node();
s->data = element;
if(head == NULL)
head = s;
while(p->next){
p = p->next;
}
p->next = s;
s->prev = p;
return head;
}
Doublelink tail_delete(Doublelink head){
Doublelink p = head;
while(p->next->next){
p = p->next;
}
Doublelink s = p->next;
p->next = NULL;
p->next->prev = NULL;
free(s);
return head;
}