1 //双链表 2 3 #include <stdio.h> 4 #include <stdbool.h> 5 #include <malloc.h> 6 7 typedef struct DNode 8 { 9 int data; 10 struct DNode *prior,*next;//prior指向上一个结点,next指向下一个结点 11 }DNode,*DLinkList; 12 13 bool InitList(DLinkList L)//初始化双链表 14 { 15 L=NULL; 16 return true; 17 } 18 19 DLinkList createDLinkList(DLinkList L)//尾插法建立双链表 20 { 21 L=(DLinkList)malloc(sizeof(DNode)); 22 L->next=NULL; 23 DNode *s; 24 DNode *e=L;//e为表尾的结点,此时L就是最后的结点 25 int value; 26 scanf("%d",&value); 27 while(value!=9999) 28 { 29 s=(DNode *)malloc(sizeof(DNode)); 30 s->data=value; 31 e->next=s; 32 s->prior=e;//s的上一个结点指向e 33 e=s;//将e指向s,即最后一个结点 34 scanf("%d",&value); 35 } 36 return L; 37 } 38 39 DNode *GetElem(DLinkList L,int i)//按位查找结点 40 { 41 DNode *p;//存放最后返回的结点 42 p=L->next;//先从第一个结点开始遍历 43 if(i==0) 44 { 45 return L;//第零个节点是头指针?头结点是第一个结点? 46 } 47 if(i<1) 48 { 49 return NULL; 50 } 51 int j=1;//此时p在第一个结点处 52 while(p!=NULL && j<i) 53 { 54 p=p->next;//第一次循环,p遍历到第二个结点 55 j++; 56 } 57 return p;//返回p结点 58 } 59 60 void DLinklist_insert(DLinkList L,int i,int value)//插入操作 61 { 62 DNode *p; 63 DNode *s = GetElem(L,i-1);//获取前一个结点 64 p=(DNode *)malloc(sizeof(DNode)); 65 p->next=s->next; 66 s->next->prior=p; 67 p->prior=s; 68 s->next=p; 69 p->data=value; 70 } 71 72 void DLinklist_delete(DLinkList L,int i)//删除操作 73 { 74 DNode *p=GetElem(L,i); 75 p->prior->next=p->next; 76 p->next->prior=p->prior; 77 free(p);//不要忘记释放内存 78 } 79 80 int main() 81 { 82 DLinkList L; 83 InitList(L); 84 L = createDLinkList(L); 85 DLinklist_insert(L,3,666); 86 DLinklist_delete(L,3); 87 printf("%d",GetElem(L,3)->data); 88 return 0; 89 }