C语言实现双向链表

来源:互联网 发布:琅琊榜飞剑升阶数据 编辑:程序博客网 时间:2024/04/28 07:26
#include <stdio.h>#include <stdlib.h>typedef struct DuLNode{int data;struct DuLNode *prior;struct DuLNode *next;}DuLNode, *DuLinkList;DuLinkList GetElemP_DuL(DuLinkList L, int i);void CreateList_DuL(DuLinkList &L, int n){L = (DuLinkList)malloc(sizeof(DuLNode));L->next = L;L->prior = L;DuLinkList p = (DuLinkList)malloc(sizeof(DuLNode));scanf("%d",&p->data);p->prior = L;L->next = p;L->prior = p;p->next = L;for(int i =1; i < n; i++){DuLinkList p = (DuLinkList)malloc(sizeof(DuLNode));scanf("%d",&p->data);p->prior = L;p->next = L->next;L->next->prior = p;L->next = p;}}DuLinkList GetElemP_DuL(DuLinkList L, int i){DuLinkList p = (DuLinkList)malloc(sizeof(DuLNode));p = L;int j = 0;while(p && j < i){p = p->next;++j;}if(!p || j > i) return NULL;return p;}void ListInsert_DuL(DuLinkList &L, int i, int e){DuLinkList p,s;if(!(p=GetElemP_DuL(L, i))) exit(-1);if(!(s = (DuLinkList)malloc(sizeof(DuLinkList)))) exit(-1);s->data = e;s->prior = p ->prior;p->prior->next = s;s->next = p;p->prior = s;printf("%d\n",s->data);printf("%d\n",s->prior->data);printf("%d\n",s->next->data);}void ListDelete_DuL(DuLinkList &L, int i, int &e){printf("进入");DuLinkList p;if(!(p = GetElemP_DuL(L, i))) exit(-1);printf("出");e = p->data;printf("%d \n",e);p->prior->next = p->next;p->next->prior = p->prior;printf("%d \n",e); //free(p);printf("%d \n",e);}int main(){DuLinkList L1,L;CreateList_DuL(L1,10);L = L1;L1 = L1->next;while(L1!= L){printf(" %d ", L1->data);L1 = L1->next;}L1 = GetElemP_DuL(L,5);printf("%d ",L1->data);L1 = L;ListInsert_DuL(L1,5,10000);L1 = L1->next;while(L1!= L){printf(" %d ", L1->data);L1 = L1->next;}L1 = L;int e = 0;ListDelete_DuL(L1,5,e);L1 = L1->next;while(L1!= L){printf(" %d ", L1->data);L1 = L1->next;}printf("%d ", e);getchar();getchar();getchar();return 0;}