双链表的基本操作
1 #include <stdio.h> 2 #include <stdlib.h> 3 typedef int ElemType; 4 typedef struct DNode{ 5 ElemType data; 6 struct DNode *prior,*next; 7 }DNode,*DLinkList; 8 //双向链表头插法 9 DLinkList Dlist_head_insert(DLinkList &DL) 10 { 11 DNode *s;int x; 12 //带头结点的链表,不带头结点 13 DL=(DLinkList)malloc(sizeof(DNode)); 14 DL->next=NULL; 15 DL->prior=NULL; 16 //从标准输入读取数据 17 scanf("%d",&x); 18 //3 4 5 6 7 9999 19 while(x!=9999){ 20 //申请一个空间空间,强制类型转换 21 s=(DLinkList)malloc(sizeof(DNode)); 22 s->data=x; 23 s->next=DL->next; 24 //插入第一个结点时,不需要这一步操作 25 if(DL->next!=NULL){ 26 DL->next->prior=s; 27 } 28 s->prior=DL; 29 DL->next=s; 30 scanf("%d",&x);//读取标准输入 31 } 32 return DL; 33 } 34 //双向链表尾插法 35 DLinkList Dlist_tail_insert(DLinkList &DL) 36 { 37 int x; 38 //带头节点的链表 39 DL=(DLinkList)malloc(sizeof(DNode)); 40 DNode *s,*r=DL; 41 DL->prior=NULL; 42 //3 4 5 6 7 9999 43 scanf("%d",&x); 44 while(x!=9999){ 45 s=(DNode*)malloc(sizeof(DNode)); 46 s->data=x; 47 r->next=s; 48 s->prior=r; 49 //r指向新的表尾结点 50 r=s; 51 scanf("%d",&x); 52 } 53 //尾结点的next指针赋值为NULL 54 r->next=NULL; 55 return DL; 56 } 57 //按序号查找结点值 58 DNode *GetElem(DLinkList DL,int i) 59 { 60 int j=1; 61 DNode *p=DL->next; 62 if(i==0) return DL; 63 if(i<1) return NULL; 64 while(p&&j<i){ 65 p=p->next; 66 j++; 67 } 68 return p; 69 } 70 //新结点插入第i个位置 71 bool DListFrontInsert(DLinkList DL,int i,ElemType e) 72 { 73 DLinkList p=GetElem(DL,i-1); 74 if(NULL==p) return false; 75 //为新插入的结点申请空间 76 DLinkList s=(DLinkList)malloc(sizeof(DNode)); 77 s->data=e; 78 s->next=p->next; 79 p->next->prior=s; 80 s->prior=p; 81 p->next=s; 82 return true; 83 } 84 //删除第i个结点 85 bool DListDelete(DLinkList DL,int i) 86 { 87 DLinkList p=GetElem(DL,i-1); 88 if(NULL==p) return false; 89 DLinkList q; 90 q=p->next; 91 //删除的元素不存在 92 if(q==NULL) return false; 93 //断链 94 p->next=q->next; 95 if(q->next!=NULL){ 96 q->next->prior=p; 97 } 98 //释放对应结点的空间 99 free(q); 100 return true; 101 } 102 //链表打印 103 void PrintDList(DLinkList DL) 104 { 105 DL=DL->next; 106 while(DL!=NULL){ 107 printf("%3d",DL->data); 108 DL=DL->next; 109 } 110 printf("\n"); 111 } 112 113 //双链表增删查 114 int main() 115 { 116 DLinkList DL; 117 DLinkList search; 118 //Dlist_head_insert(DL); 119 Dlist_tail_insert(DL); 120 //3 4 5 6 7 9999 121 PrintDList(DL); 122 search=GetElem(DL,2); 123 if(search!=NULL){ 124 printf("按序号查找成功\n"); 125 printf("%3d\n",search->data); 126 } 127 DListFrontInsert(DL,3,99); 128 PrintDList(DL); 129 DListDelete(DL,2); 130 PrintDList(DL); 131 system("pause"); 132 }