双向链表C语言实现

#include<stdio.h>
#include<stdlib.h> 
//node.h
typedef int Type;
struct Node
{
	Type data;
	struct Node* prev;
	struct Node* next;
};
typedef struct Node Node;

Node* GetNode(Type item,Node* p,Node* n)//生成一个结点,返回结点指针 
{
	Node *re;
	re=(Node*)malloc(sizeof(Node));
	re->data=item;
	re->prev=p;
	re->next=n;
	return re; 
}

Node* GetNext(Node* itr)//读取结点的后继结点的指针 
{
	return itr->next;
}

Node* GetPrev(Node* itr)//读取结点的前驱结点的指针 
{
	return itr->prev;
}

Type GetData(Node* itr){return itr->data;}

//list.h
typedef struct
{
	Node *head;
	Node *tail;
	int size;
}List;

void InitList(List *L);
int Size(List* l);
int Empty(List* l)
{
	return l->size==0;
}

void InitList(List* l)//建空表 
{
	l->head=GetNode(0,NULL,NULL);
	l->tail=GetNode(0,NULL,NULL);
	l->head->next=l->tail;
	l->tail->prev=l->head;
	l->size=0; 
}

Node* Begin(List *l)//读取结点首结点 指针 
{
	return l->head->next;} 

Node* End(List *l)//读取链表尾结点指针 
{
	return l->tail;
 } 

//链表插入
Node* Insert(List *l,Node* itr,Type item)//链表插入 :在指针itr指向前插入一个结点,插入结点的值是item的值,返回的是新插入的结点指针 
{
	Node* p=itr;
	p->prev->next=GetNode(item,p->prev,p);
	p->prev=p->prev->next;
	l->size++;
	return p->prev;
 } 
 
 void PushFront(List* l,Type item)//首插=在数据首节点前插入 
 {
 	Insert(l,Begin(l),item);
 }
 
 void PushBack(List* l,Type item)//尾插=在链表尾结点前插入 
 {
 	Insert(l,End(l),item); 
 }
 
 void OutputList(List* l)//从前往后输出链表 
 {
 	Node* first=Begin(l);
 	Node* last=End(l);
	for(;first!=last;first=GetNext(first)) 
		printf("%d\t",GetData(first));
	printf("\n");
 }
 
 void OutputListReverse(List* l)
 {
 	Node* last=GetPrev(End(l));
 	Node* first=GetPrev(Begin(l));
 	for(;last!=first;last=GetPrev(last))
 		printf("%d\t",GetData(last));
 	printf("\n");
 }
 
 Node* Erase(List *l,Node* itr)//定点删除,删除一个指针指向的结点 
 {
 	Node* p=itr;
 	Node* re=p->next;
 	p->prev->next=p->next;//先把p后面的结点地址给,p前面结点的next指针 
 	p->next->prev=p->prev;//再霸p前面结点的地址给,p后面结点的prev指针 
	 free(p);
	 l->size--;
	 return re; 
 }
 
 void PopFront(List * l)
 {
 	Erase(l,Begin(l));
 }
 
 void PopBack(List *l)
 {
 	Erase(l,GetPrev(End(l)));
 }
 
 void Clear(List *l)
 {
 	while(!Empty(l))
 		PopFront(l);
 }
 
 void FreeList(List *l)
 {
 	Clear(l);
 	free(l->head);
 	free(l->tail);
 }
 
 int main()
 {
 	int item;
 	List L;
 	InitList(&L);
 	scanf("%d",&item);
 	while(item!=0)
 	{
 		PushBack(&L,item);
 		scanf("%d",&item);
	 }
	 PopFront(&L);
	 PopBack(&L);
	 OutputList(&L);
	 FreeList(&L);
	 return 0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值