数据结果之双向链表
1创建循环链表,带头结点的
2判断双链表是否为空
3返回双链表的长度
4插入元素,返回1表示插入成功,0表示失败
5删除元素,返回1表示插入成功,0表示失败
6查找元素,查找成功返回1,失败返回0
7反向输出元素
8双向链表的排序,从小到大排序
9返回元素elem的前驱元素
10返回元素elem的后继元素,返回0表示失败
11顺序输出
1 //数据结构之双链表 2 #include<stdio.h> 3 #include<stdlib.h> 4 typedef struct Dlinklist 5 { 6 int data; 7 struct Dlinklist *next; 8 struct Dlinklist *pre; 9 }Dlinklist; 10 11 //创建循环链表,带头结点的 12 Dlinklist *dlinkcreate() 13 { 14 int n=0,i=0; 15 Dlinklist *dhead,*p,*q; 16 dhead=(Dlinklist *)malloc(sizeof(Dlinklist)); 17 dhead->next=NULL; 18 dhead->pre=NULL; 19 p=dhead; 20 printf("输入要插入节点的个数:\n"); 21 scanf("%d",&n); 22 printf("输入各个元素:\n"); 23 for(i=0;i<n;i++) 24 { 25 q=(Dlinklist *)malloc(sizeof(Dlinklist)); 26 scanf("%d",&q->data); 27 q->pre=p; 28 p->next=q; 29 p=q; 30 p->next=NULL; 31 } 32 return dhead; 33 } 34 void dlinkdisplay(Dlinklist *dlist) 35 { 36 if(dlist->next==NULL) 37 { 38 printf("双链表为空"); 39 exit(0); 40 } 41 Dlinklist *p; 42 p=dlist->next; 43 while(p) 44 { 45 printf("%d ",p->data); 46 p=p->next; 47 } 48 printf("\n"); 49 } 50 //判断双链表是否为空 51 int dlinkisempty(Dlinklist *dlist) 52 { 53 if(dlist->next==NULL) 54 return 1; 55 else 56 return 0; 57 } 58 //返回双链表的长度 59 int dlinklength(Dlinklist *dlist) 60 { 61 int len=0; 62 Dlinklist *p; 63 p=dlist->next; 64 while(p) 65 { 66 len++; 67 p=p->next; 68 } 69 return len; 70 } 71 //插入元素,返回1表示插入成功,0表示失败,在第loc个元素之前插入,0表示在尾插入 72 int dlinkinsert(Dlinklist *dlist,int a,int loc) 73 { 74 Dlinklist *p,*q; 75 q=(Dlinklist *)malloc(sizeof(Dlinklist)); 76 q->data=a; 77 q->next=NULL; 78 q->pre=NULL; 79 int i=1; 80 if(loc<0||loc>dlinklength(dlist)) 81 { 82 printf("参数不正确"); 83 return 0; 84 } 85 p=dlist->next; 86 if(loc==0)//尾部插入 87 { 88 while(p->next) 89 { 90 p=p->next; 91 } 92 p->next=q; 93 p=q->pre; 94 return 1; 95 96 } 97 while(i<loc) 98 { 99 i++; 100 p=p->next; 101 } 102 p->pre->next=q; 103 q->pre=p->pre; 104 q->next=p; 105 p->pre=q; 106 return 1; 107 } 108 109 110 //删除元素,返回1表示插入成功,0表示失败 删除第loc个元素 111 int dlinkdelete(Dlinklist *dlist,int loc) 112 { 113 Dlinklist *p; 114 int i=1; 115 p=dlist->next; 116 if(loc<1||loc>dlinklength(dlist)) 117 { 118 printf("参数不正确"); 119 return 0; 120 } 121 while(i<loc) 122 { 123 i++; 124 p=p->next; 125 } 126 p->pre->next=p->next; 127 p->next->pre=p->pre; 128 free(p); 129 return 0; 130 } 131 //查找元素,查找成功返回1,失败返回0 132 int dlinkfind(Dlinklist *dlist,int val) 133 { 134 Dlinklist *p; 135 if(dlist->next==NULL) 136 { 137 printf("双链表为空"); 138 return 0; 139 } 140 p=dlist->next; 141 while(p) 142 { 143 if(p->data==val) 144 { 145 return 1; 146 } 147 p=p->next; 148 } 149 return 0; 150 151 } 152 //反向输出元素 153 void dlinkrdisplay(Dlinklist *dlist) 154 { 155 Dlinklist *p; 156 p=dlist->next; 157 while(p->next) 158 { 159 p=p->next; 160 } 161 while(p!=dlist) 162 { 163 printf("%d ",p->data); 164 p=p->pre; 165 } 166 printf("\n"); 167 } 168 //双向链表的排序,从小到大排序 169 170 void swap(int *a,int *b) 171 { 172 int temp; 173 temp=*a; 174 *a=*b; 175 *b=temp; 176 } 177 void dlinksort(Dlinklist *dlist) 178 { 179 Dlinklist *p,*q; 180 p=dlist->next; 181 q=p->next; 182 while(p) 183 { 184 q=p; 185 while(q) 186 { 187 if(p->data>q->data) 188 { 189 swap(&p->data,&q->data); 190 } 191 q=q->next; 192 } 193 p=p->next; 194 } 195 } 196 //返回元素elem的前驱元素 197 int dlinklistpr(Dlinklist *dlist,int elem) 198 { 199 Dlinklist *p=dlist->next; 200 if(dlinkfind(dlist,elem)==0) 201 { 202 printf("elem 不存在"); 203 return 0; 204 } 205 else if(p->data==elem) 206 { 207 printf("elem 没有前驱元素\n"); 208 return 0; 209 } 210 else 211 { 212 while(p->data!=elem) 213 { 214 p=p->next; 215 } 216 return p->pre->data; 217 } 218 } 219 220 //返回元素elem的后继元素,返回0表示失败 221 int dlinklistnext(Dlinklist *dlist,int elem) 222 { 223 224 Dlinklist *p=dlist->next; 225 if(dlinkfind(dlist,elem)==0) 226 { 227 printf("elem 不存在"); 228 return 0; 229 } 230 else 231 { 232 while(p->data!=elem) 233 { 234 p=p->next; 235 } 236 if(p->next==NULL) 237 { 238 printf("elem 不存在后继元素\n"); 239 return 0; 240 } 241 return p->next->data; 242 } 243 } 244 245 //测试 246 void main() 247 { 248 Dlinklist *dlist; 249 dlist=dlinkcreate(); 250 printf("dlist 是否为空:%d\n",dlinkisempty(dlist)); 251 dlinkdisplay(dlist); 252 printf("反向输出的序列为:"); 253 dlinkrdisplay(dlist); 254 printf("dlist 的元素个数为:%d\n",dlinklength(dlist)); 255 dlinkinsert(dlist,100,3); 256 printf("插入之后的序列:"); 257 dlinkdisplay(dlist); 258 printf("删除之后的序列:"); 259 dlinkdelete(dlist,4); 260 dlinkdisplay(dlist); 261 printf("反向输出的序列为:"); 262 dlinkrdisplay(dlist); 263 printf("查找元素(成功?)%d\n",dlinkfind(dlist,6)); 264 printf("排序之后的序列:"); 265 dlinksort(dlist); 266 dlinkdisplay(dlist); 267 printf("前驱元素为:%d\n",dlinklistpr(dlist,5)); 268 printf("后继元素为:%d\n",dlinklistnext(dlist,5)); 269 271 }
---恢复内容结束---