1.动态链表
链表的基本知识已经在c中学过了,这里写一下链表是如何排序的
#include<stdio.h>
#include<stdlib.h>//
struct Id
{
int a;
struct Id *next;
};
struct Id *head()//返回头指针的函数
{
int n,i;
scanf("%d",&n);
struct Id *head,*end,*pnew;//因为new是一个关键字,所以用pnew
pnew=(struct Id*)malloc(sizeof(struct Id));//第一个节点要特殊处理,所以放在循环外
scanf("%d",&pnew->a);
head=end=pnew;
for(i=1;i<n;i++)
{
pnew=(struct Id*)malloc(sizeof(struct Id));
scanf("%d",&pnew->a);
end->next=pnew;
end=pnew;
}
end->next=NULL;
struct Id *p=head,*q=head;
int temp;
while(n>1)//类似于冒泡排序,俩层循环
{
while(p->next!=NULL)
{
if(p->a>p->next->a)
{
temp=p->a;
p->a=p->next->a;
p->next->a=temp;
}
p=p->next;
}
n--;
p=head->next;
}
return q;//返回头指针
}
int main()
{
struct Id *p=head();
while(p!=NULL)
{
printf("%d ",p->a);
p=p->next;
}
return 0;
}
2.循环链表
将单链表中终端结点的指针端由空指针改为头节点,就是整个单链表形成一个换一个环,这种头尾相接的单链表就称为循环链表
单链表转换为循环链表的核心代码
A和B表合并为循环链表
p=rearA->next;//保存A表头节点
rearA->next=rearB->next->next;//将本指向B表的第一个节点(不是头节点)赋值给rearA->next
q=rearB->next;
rearB->next=p;//将原A表的头结点赋值给rearB->next
free(P);
3.双向链表
双向链表是在单链表的每个节点中,在设置一个指向其前驱节点的指针
定义如下
struct NOed
{
int date;
struct Noed *prior;
struct Node *next;
};
双向链表的插入(注意顺序)
s->prior=p;//p赋值给s的前驱
s->next=p->next;//把p->next赋值给s的后继
p->next->prior=s;//把s赋值给p->next的前驱
p->next=s;//把s的值赋值给p的后继
双向链表的删除
p->prior->next=p->next;//把p->next的值赋值给p->prior的后继
p->next->prior=p->prior;//把p->prior赋值给p->next的前驱
free(p);