作答和题目都在下面,想问问为什么这样写是错误的,用debug看到每一句都有运行,但是结果事实上结果却是不如意的
2条回答 默认 最新
- 赵4老师 2023-03-01 11:12关注
仅供参考:
//不带表头结点的循环双向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> #include <locale.h> struct NODE { int data; struct NODE *next; struct NODE *prev; } *head,*p,*q,*s,*p1,*p2,*q1,**ta; int i,k,n,t,m,v,N=10; int main() { setlocale(LC_ALL,"chs"); srand(time(NULL)); head=NULL; printf("创建%d个节点的循环双向链表:",N);//创建N个节点的循环双向链表 p=head; for (i=0;i<N;i++) { q=(struct NODE *)malloc(sizeof(struct NODE)); if (NULL==q) exit(1); q->data=rand()%100;//填写0..99的随机值 q->next=NULL; q->prev=NULL; if (NULL==p) { head=q; p=head; } else { p->next=q; q->prev=p; p=q; } } p->next=head; head->prev=p; //输出整个循环双向链表 s=head; while (1) { if (NULL==s) { printf("\n"); break; } printf("%02d(=)",s->data); if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;} s=s->next; if (s==head) { printf(" Loop\n"); break; } } k=3; v=5; printf("将值为%d的结点插入到循环双向链表的第%d个结点前:",v,k);//将值为v的结点插入到循环双向链表的第k个结点前 n=0; p=head; while (1) { if (NULL==p) { break; } n++; if (k==1) { q=(struct NODE *)malloc(sizeof(struct NODE)); if (NULL==q) exit(1); q->data=v; q->next=head; q->prev=head->prev; head->prev->next=q; head->prev=q; head=q; break; } else { if (k-1==n) { q=(struct NODE *)malloc(sizeof(struct NODE)); if (NULL==q) exit(1); q->data=v; q->next=p->next; q->prev=p; p->next->prev=q; p->next=q; break; } } p=p->next; if (p==head) break; } //输出整个循环双向链表 s=head; while (1) { if (NULL==s) { printf("\n"); break; } printf("%02d(=)",s->data); if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;} s=s->next; if (s==head) { printf(" Loop\n"); break; } } k=5; printf("删除第%d个节点:",k);//删除第k个节点 n=0; p=head; while (1) { if (NULL==p) { break; } n++; if (k==1) { q=head; head=head->next; head->prev=q->prev; q->prev->next=head; if (q==head) head=NULL; free(q); break; } else { if (k-1==n) { q=p->next; p->next=q->next; q->next->prev=p; free(q); break; } } p=p->next; if (p==head) break; } //输出整个循环双向链表 s=head; while (1) { if (NULL==s) { printf("\n"); break; } printf("%02d(=)",s->data); if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;} s=s->next; if (s==head) { printf(" Loop\n"); break; } } printf("从小到大排序:");//从小到大排序 for (p=head;p!=NULL;) { p1=p->prev; for (q=p->next,q1=p;q!=NULL;) { if (p->data > q->data) { //交换data // printf("swap %02d %02d\n",p->data,q->data); // t=p->data;p->data=q->data;q->data=t; //或者 //交换prev和next // printf("swap %02d %02d\n",p->data,q->data); if (p==head) {//p是头 if (p->next==q) {//pq挨着 head=q; head->prev=p1; p1->next=q; p->next=q->next; p->prev=q; q->next->prev=p; q->next=p; q=p; p=head; } else {//pq不挨着 head=q; head->prev=p1; p1->next=q; p2=p->next; p->next=q->next; p->next->prev=p; p->prev=q1; q->next->prev=p; q->next=p2; p2->prev=q; q1->next=p; q=p; p=head; } } else {//p不是头 if (p->next==q) {//pq挨着 p1->next=q; p->next=q->next; p->prev=q; q->next->prev=p; q->next=p; q->prev=p1; q=p; p=p1->next; } else {//pq不挨着 p1->next=q; p2=p->next; p->next=q->next; p->prev=q->prev; q->next->prev=p; q->next=p2; q->prev=p1; p2->prev=q; q1->next=p; q=p; p=p1->next; } } //输出整个循环双向链表 // s=head; // while (1) { // if (NULL==s) { // printf("\n"); // break; // } // printf("%02d(=)",s->data); // if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;} // s=s->next; // if (s==head) { // printf(" Loop\n"); // break; // } // } // printf("head,p,q:%02d %02d %02d\n",head->data,p->data,q->data); // getchar(); } q1=q;q=q->next; if (q==head) break; } p=p->next; if (p->next==head) break; } //输出整个循环双向链表并计算链表长度n n=0; s=head; while (1) { if (NULL==s) { printf("\n"); break; } printf("%02d(=)",s->data); if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;} n++; s=s->next; if (s==head) { printf(" Loop\n"); break; } } printf("将整个链表逆序:");//将整个链表逆序 if (n>=2) { p=head; while (1) { q=p->prev;p->prev=p->next;p->next=q; p=p->next; if (p==head) break; } } //输出整个循环双向链表 s=head; while (1) { if (NULL==s) { printf("\n"); break; } printf("%02d(=)",s->data); if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;} s=s->next; if (s==head) { printf(" Loop\n"); break; } } m=4; n=6; printf("将循环双向链表中前%d个结点和后%d个结点进行互换:",m,n);//将循环双向链表中前m个结点和后n个结点进行互换,m+n为链表总长 k=0; p=head; while (1) { if (NULL==p) { break; } k++; if (m==k) { q=p; break; } p=p->next; if (p==head) break; } head=q->next; //输出整个循环双向链表 s=head; while (1) { if (NULL==s) { printf("\n"); break; } printf("%02d(=)",s->data); if (NULL!=s->next && s->next->prev!=s) {printf(" !\n");break;} s=s->next; if (s==head) { printf(" Loop\n"); break; } } //释放所有节点 p=head; while (1) { if (NULL==p) { break; } q=p->next; free(p); p=q; if (p==head) { break; } } return 0; } //创建10个节点的循环双向链表:12(=)46(=)31(=)63(=)25(=)91(=)39(=)02(=)92(=)68(=) Loop //将值为5的结点插入到循环双向链表的第3个结点前:12(=)46(=)05(=)31(=)63(=)25(=)91(=)39(=)02(=)92(=)68(=) Loop //删除第5个节点:12(=)46(=)05(=)31(=)25(=)91(=)39(=)02(=)92(=)68(=) Loop //从小到大排序:02(=)05(=)12(=)25(=)31(=)39(=)46(=)68(=)91(=)92(=) Loop //将整个链表逆序:92(=)91(=)68(=)46(=)39(=)31(=)25(=)12(=)05(=)02(=) Loop //将循环双向链表中前4个结点和后6个结点进行互换:39(=)31(=)25(=)12(=)05(=)02(=)92(=)91(=)68(=)46(=) Loop //
解决 无用评论 打赏 举报
悬赏问题
- ¥15 设计一个温度闭环控制系统
- ¥100 关于加载卡的问题有能知道这个要怎么处理吗?
- ¥100 rtmpose姿态评估
- ¥15 java 通过反射找路径下的类,打包后就找不到
- ¥15 通联支付网上收银统一下单接口
- ¥15 angular有偿编写,
- ¥15 centos7系统下abinit安装时make出错
- ¥15 hbuildex运行微信小程序报错
- ¥15 关于#python#的问题:我知道这个问题对你们来说肯定so easy
- ¥15 wpf datagrid如何实现多层表头