天天看点

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

#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); // travel(&list); //clear(&list); //travel(&list); Delete(&list,3); travel(&list); getchar(); return 0; }

继续阅读