双方向リストのバブルソートについて
双方向リストをバブルソートを用いてソートしたいです。
下記がプログラム(一部)ですが、ソートした後にリスト表示すると
無限ループに陥ります。
どこがいけないのでしょうか。
#include <stdio.h>
#include <stdlib.h>
struct cell{
int data;
struct cell *next, *prev;
};
void insert_head(struct cell **head, int num){
struct cell *p, *p1;
p = *head;
p1 = make_cell();
*head = p1;
p1->data = num;
p1->next = p;
if(p1->next != (struct cell *)NULL){
p1->next = p;
p->prev = p1;
}
}
void print_list(struct cell *head){
struct cell *p;
p = head;
printf("data = \n");
while(p != (struct cell *)NULL){
printf("%d\n", p->data);
p = p->next;
}
}
void sort_list(struct cell **head){
struct cell *p, *p2;
int i, n;
n = 0;
p = *head;
while(p->next != (struct cell *)NULL){
p = p->next;
n++;
}
for(i = 0, p = *head; i < n-2; i++){
if(p->data > p->next->data){
if(p == *head){
*head = p->next;
}else{
p->prev->next = p->next;
}
p2 = p->next;
p->next = p->next->next;
p->next->next = p;
p->next->next->prev = p;
p->next->prev = p->prev;
p->prev = p2;
}else
p = p->next;
}
}
int main(void){
struct cell *head = (struct cell *)NULL;
int n;
while(1){
printf("1:Insert head 2:Insert tail 3:Delete 4:List 5:Sort 6:Exit\n");
scanf("%d", &n);
switch(n){
case 1:
printf("num = ");
scanf("%d", &n);
insert_head(&head, n);
break;
case 2:
printf("num = ");
scanf("%d", &n);
insert_tail(&head, n);
break;
case 3:
printf("num = ");
scanf("%d", &n);
delete_cell(&head, n);
break;
case 4:
print_list(head);
break;
case 5:
sort_list(&head);
break;
case 6:
return 0;
break;
}
}
}