#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;
}
双向链表C语言实现
最新推荐文章于 2024-10-03 16:28:03 发布
4857

被折叠的 条评论
为什么被折叠?



