最近准本系统的学习一下,algorithms in C;所以将自己学习的心得和体会准本和大家分享。欢迎大神批评指导;今天先进入链表这一节。链表可谓是所有数据结构的基础,所以学好链表是一切开始的源泉。
所谓的链表逆序就是将链表反向输出。例如输入:1,2,3,4,5;反向5,4,3,2,1;下面给出程序:大家体会一下
struct node *reverse(struct node *head)
{
struct node *r = NULL;
struct node *x, *y;
y = head->next; //
while(y->next != NULL)
{
x = y->next;
y->next = r;
r = y;
y = x;
}
y->next = r;
head->next = y;
return head;
}
链表排序(处于个人爱好和方便,对于每个链表我都会有一个头结点
![微笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif)
//-------------------------链表排序采用选择排序的思想,当然也可以采用插入排序---------------------------------------------------------
struct node* ListSort(struct node *heada)
{
struct node *headb;
struct node *ra1;
struct node*ra2; //指向ra1的前去
struct node *maxpre = NULL; //指向最大值节点的前趋
struct node *max; //指向最大值节点用于向headb中插入;
headb = (struct node *)malloc(sizeof(struct node));
headb->next = NULL;
while(heada->next!= NULL)
{
maxpre = heada;
ra2 = heada;
ra1 = heada->next;
while(ra1->next != NULL)
{
ra1 = ra1->next;
ra2 = ra2->next;
if(maxpre->next->data<ra1->data)
{
maxpre = ra2;
}
}
//-----------------从heada中将最大值删除----------------------
max = maxpre->next;
maxpre->next = max->next;
max->next = NULL;
//--------------将最大值插入headb(因为选择的是最大值且是升序排序所以,所以直接在头结点后插入)-------------------------
max->next = headb->next;
headb->next = max;
}
return headb;
}
链表创建:
void ListCreate(struct node *&head)
{
struct node *r;
for(int i = 1; i<= N; i++)
{
r= (struct node *)malloc(sizeof(struct node));
r->data = rand()%50;
r->next = NULL;
r->next = head->next;
head->next = r;
}
}
main函数:
void main()
{
struct node *head = (struct node *)malloc(sizeof(struct node));
head->next = NULL;
ListCreate(head);
struct node *r;
r = head->next;
printf("-------------随机生成链表----------------------\n");
while(r != NULL)
{
printf("%d ",r->data);
r = r->next;
}
printf("\n");
head = reverse(head);
printf("---------逆序后的链表----------------\n");
r = head->next;
while(r != NULL)
{
printf("%d ",r->data);
r = r->next;
}
printf("\n");
r = ListSort(head);
printf("------------排序后的链表------------------\n");
r = r->next;
while(r != NULL)
{
printf("%d ",r->data);
r = r->next;
}
printf("\n");
}
上面程序中少了一个N这是个宏定义节点个数,你可以随意定义一下
![微笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif)