双向链表(无注释...慎入)

#include<cstdio>
#include<cstdlib>
typedef struct Node{
int data;
struct Node*prev;
struct Node*next;
}Node;
typedef struct List{
Node* head;
Node* tail;
}List;
Node * NodeCreate(int data){
Node* PtrNew =(Node*) malloc(sizeof(Node));
PtrNew->data = data;
PtrNew->prev = NULL;
PtrNew->next = NULL;
return PtrNew;
}
void PushHead(List *list,int data){//ok
Node*PtrNew= NodeCreate(data);
if(list->head){// 如果链表不为空
PtrNew->next  = list->head;
list->head->prev = PtrNew;
list->head = PtrNew;
}else{
list->head=PtrNew;
list->tail = PtrNew;
}
}
void PushTail(List *list,int data){//ok
Node* PtrNew = NodeCreate(data);
if(list->head){
PtrNew->prev = list->tail;
list->tail->next = PtrNew;
list->tail = PtrNew;
}else{
list->head=PtrNew;
list->tail = PtrNew;
}
}
int PopFront(List *list){
if(!list->head){
printf("no data!\n");
return 0;
}
if (list->head->next){
Node* PtrTemp = list->head;
list->head=list->head->next;
PtrTemp->next->prev = NULL;
free(PtrTemp);
}
else if(list->head){
Node* PtrTemp = list->head;
free(PtrTemp);
list->head =list->tail=NULL;
}
}
int PopTail(List*list){
if(!list->tail){
printf("no data!\n");
return 0;
}
if(list->tail->prev){
Node*PtrTemp = list->tail;
list->tail = list->tail->prev;
PtrTemp->prev->next =NULL;
free(PtrTemp);
}else if(list->tail){
Node*PtrTemp = list->tail;
free(PtrTemp);
list->tail = list->head = NULL;
}
}
int GetFront(List*list){//ok
if(list->head){
return list->head->data;
}else{
printf("no data exist\n");
}
}
int GetTail(List*list){
if(list->tail){
return list->tail->data;
}else{
printf("no data exit\n");
}
}
int GetLength(List *list){//ok
Node* PtrNew = (list->head);
int counter = 0;
while(PtrNew){
PtrNew = PtrNew->next;
counter++;
}
return counter;
}
void travel(List*list){//ok
if(!list->head){
printf(" no data\n");
}else{
printf(" the data of the list is ");
for(Node*PtrNew =list->head;PtrNew;PtrNew=PtrNew->next){
printf("%d ",PtrNew->data);
}
printf("\n");
}
}
int InsertNode(List*list,int position,int data){//ok
if(position < 0||position>GetLength(list)){
printf("the position is invalid\n");
position = 0;
}
if(position == 0){
PushHead(list,data);
return 0;
}
Node* PtrNew = NodeCreate(data);
Node* PtrTempHead = list->head;
int i;
for(i= 0;i<position-1;i++){
PtrTempHead = PtrTempHead->next;
}
if(position == (GetLength(list))){
PushTail(list,data);
}else{
PtrNew->next = PtrTempHead->next;
PtrNew->prev = PtrTempHead;
PtrTempHead->next->prev = PtrNew;
PtrTempHead->next = PtrNew;
}
}
void Delete(List *list,int data){
for(Node* node = list->head,*next;node;node= next){
next = node->next;
if (data == node->data){
if(node->prev){
node->prev->next = node->next;
}else{
list->head = node->next;
}
if(node->next){
node->next->prev = node ->prev;
}else{
list->tail = node->prev;
}
free(node);
}
}
}
void clear(List *list){
for(Node*next;list->head;list->head=next){
next = list->head->next;
free(list->head);
}
}
int main(){
List list;
list.head = NULL;
list.tail = NULL;
PushHead(&list,5);
PushHead(&list,4);
printf("front is %d\n",GetFront(&list));
printf("tail is %d\n",GetTail(&list));
printf("the length of list is %d\n",GetLength(&list));
PushTail(&list,6);
InsertNode(&list ,0,3);
InsertNode(&list ,1,33);
InsertNode(&list ,4,55);
InsertNode(&list ,6,66);
InsertNode(&list ,12,100);
printf("the the length of list is %d\n",GetLength(&list));
travel(&list);
/* PopFront(&list);
travel(&list);
PopFront(&list);
travel(&list);
PopFront(&list);
travel(&list);
PopFront(&list);
travel(&list);
PopFront(&list);
travel(&list);
PopFront(&list);
travel(&list);
PopFront(&list);
travel(&list);
PopFront(&list);
travel(&list);
PopFront(&list);
// travel(&list);
/* PopTail(&list);
travel(&list);
PopTail(&list);
travel(&list);
PopTail(&list);
travel(&list);
PopTail(&list);
travel(&list);
PopTail(&list);
travel(&list);
PopTail(&list);
travel(&list);
PopTail(&list);
travel(&list);
PopTail(&list);
travel(&list);
PopTail(&list);*/
// travel(&list);
//clear(&list);
//travel(&list);
Delete(&list,3);
travel(&list);
getchar();
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值