C 为链表实现shell排序?
我试图在单链接列表上实现shell排序。我试图做的是根据C 为链表实现shell排序?,c,C,我试图在单链接列表上实现shell排序。我试图做的是根据inc值获取相应的元素并对它们进行排序。但是,我只熟悉数组上的shell排序实现,而不熟悉链表。感谢您的帮助 struct node { int data; struct node *next; };
inc
值获取相应的元素并对它们进行排序。但是,我只熟悉数组上的shell排序实现,而不熟悉链表。感谢您的帮助
struct node
{ int data;
struct node *next;
};
typedef struct node n;
void add(int a);
void shellsort(int size);
void display();
void moveptr(n*a, int distance);
n* head=NULL;
void main()
{ int i,x,size;
printf("How many elements do you want to enter: ");
scanf("%d",&size);
printf("Enter the data: ");
for(i=0;i<size;i++)
{ scanf("%d",&x);
add(x);
}
printf("List currently is: ");
display();
shellsort(size);
printf("\nafter sorting list is: ");
display();
}
void add(int a)
{ n *temp = (n*)malloc(sizeof(n));
temp->data=a;
temp->next=head;
head=temp;
}
void display()
{ n* temp=head;
while(temp!=NULL)
{ printf("%d-->",temp->data);
temp=temp->next;
}
}
void moveptr(n *ptr, int distance) // this moves a temp pointer to required location
{ int i=0;
while(i<distance)
{
ptr=ptr->next;
i=i+1;
}
}
void shellsort(int size)
{ int i,j,temp,inc=size/2;
n *a=head,*b=head;
do{
for(i=0;i<size;i++)
{
for(j=i+inc;j<size;j+=inc)
{ b=head;
moveptr(b,j);
if(a->data > b->data)
{ temp=b->data;
b->data=a->data;
a->data=temp;
}
}
a=a->next;
}
inc=inc/2;
}while(inc>=1);
}
struct节点
{int数据;
结构节点*下一步;
};
typedef结构节点n;
无效添加(INTA);
空壳排序(整数大小);
void display();
void moveptr(n*a,int距离);
n*head=NULL;
void main()
{int i,x,大小;
printf(“要输入多少元素:”);
scanf(“%d”,大小(&S);
printf(“输入数据:”);
对于(i=0;idata=a;
温度->下一步=头部;
压头=温度;
}
无效显示()
{n*temp=头部;
while(temp!=NULL)
{printf(“%d-->”,temp->data);
温度=温度->下一步;
}
}
void moveptr(n*ptr,int distance)//将临时指针移动到所需位置
{int i=0;
而(不精确;
i=i+1;
}
}
空壳排序(整数大小)
{int i,j,temp,inc=size/2;
n*a=水头,*b=水头;
做{
对于(i=0;i b->data)
{temp=b->数据;
b->data=a->data;
a->data=temp;
}
}
a=a->next;
}
inc=inc/2;
}而(inc>=1);
}
如果您坚持使用shell排序:
- 为列表项分配一个指针数组
- 初始化此数组以指向列表中的各个项目
- 使用shell排序对数组进行排序
- 按数组元素的顺序重新链接列表
- 释放列表