试用c语言编写一高效算法,将一顺序存储的线性表(设元素均为整型)中所有零元素向表尾集中,其它元素则顺序向表头方向集中
常见思路:
1,从前往后扫描,见到0元素先记数,再将后续一非0元素,前移并继续扫描,全部扫完后再把后续部分清0``
2,从前往后扫描,见到0元素则与尾部非0元素互换
前期准备
- 链表的构建
#include<stdio.h>
#include<malloc.h>
typedef struct Lnode {
int date;
struct Lnode *next;
}Londe,*Linklist;//create a single list
//尾插法建立链表
Linklist CreateList(int n)
{
Linklist Head;//头指针
Londe *p, *r;//建立链表的指针
Head = NULL, r = NULL;
if (n < 0)
{
return 0;
}
for (int i = 0; i < n+1; i++)
{
if (Head == NULL)
{
p = (Linklist)malloc(sizeof(Linklist));
p->date = NULL;//建立头节点
r = p;
Head = p;
}
else {
p = (Linklist)malloc(sizeof(Linklist));
scanf("%d", p->date);
r->next = p;
r = p;
}
}
if (r != NULL)
r->next = NULL;
return Head;
}
- 思路二的链表实现
void list_sort(Linklist L)
{
int count = 0;
Londe *p;
L = L->next;//移动到首元节点
p = L;
while (L->next != NULL)
{
if (L->date != 0) {
p->date = L->date;
p = p->next;
}
else count++;
L = L->next;
}
for (; count > 0; count--)
{
p->date = 0;
p = p->next;
}
}
- 输出函数和主函数验证
void print(Linklist L)
{
L = L->next;
while (L != NULL)
{
printf("%d ", L->date);
L = L->next;
}
}
int main()
{
Londe *L = CreateList(5);
print(L);
list_sort(L);
printf("\n");
print(L);
}
欢迎各位大佬的指正与优化
中南大学人工智能系19级学生学习笔记