1.显示链表元素
(1)把链表首结点作为当前结点;
(2)判断当前结点是否为NULL,为NULL则输出结果;
(3)输出当前结点的值;
(4)把链表的下一结点作为当前结点;
(5)重复执行步骤(1)~(3)。
例.编写一个函数,显示head指向开始结点的链表所有元素。
struct SNode
{
int num;
struct SNode *next;//下一结点地址
};
void write(struct SNode *p)
{
while(p!=NULL)
{
printf("%i\n",p->num);//输出p指向的结点的数据
p=p->next;//使p指向下一结点
}
}
2.删除链表中指定值的结点
(1)如果首结点是要删除的结点,则删除首结点,返回新的首结点地址
(2)找到要删除的结点
(3)要使删除的结点的前一个结点的next指针指向删除结点的下一个结点地址
(4)返回原首结点地址
例.编写一个函数,删除head指向开始结点的链表中值为num的下一个结点。
struct SNode
{
int num;
struct SNode *next;//下一结点地址
};
struct SNode *delete_node(struct SNode *head,int num)
{
struct SNode *p1,*p2;
if(!head)//判断是否为空链表
rerurn NULL;
if(head->num==num){//首结点既是要删除结点
p1==head;
head=head->next;
free(p1);
}
else{
p2=p1=head;
while(p2->num!=num&&p2->next)//当 p2->num==num时,退出循环
{
p1=p2;
p2=p2->next;
}
if(p2->num==num){
p1->next=p2->next;
free(p2);
}
}
return head;
}
3.创建有序列表
把一个结点插入到升序的链表,仍保持原来的链表的升序不变。
(1)创建一个新结点
(2)如果链表为空或者首结点值小于插入的结点
①新结点插入到首结点之前
②返回新的首结点地址
(3)查找链表,找到比插入点大的结点或链表尾
(4)如果到了链表尾,则新结点插入到链表尾
(5)如果不是链表尾,插入到找到的比较大的结点的前面
(6)返回头结点的地址
例.编写一个函数,在head指向开始的结点的升序链表中,插入值为num的一个结点,保存链表的升序不变
struct SNode
{
int num;
struct SNode *next;//下一结点地址
};
struct SNode *Insert_node(struct SNode *head,int num)
{
struct SNode *p,*p1,*p2;;
p=malloc(sizeof(struct SNode));
p->num=num;
if(head==NULL||p->num<=head->num){//插在链表首
p->next=head;
return p;
}
p2=p1=head;
while(p->num>p2->num&&p2->next)//查找大于等于插入元素的结点
{
p1=p2;
p2=p2->next;
}
if(p2->next==NULL){//判断是否到了链表尾
p2->next=p;
p->next=NULL;
}
else{//插在p1、p2之间
p->next=p2;
p1->next=p;
}
return head;
}
//将单链表中前m个结点和后n个结点互换,m+n=10
m=4;
n=6;
k=0;
p=head;//head为头结点
while (1) {
if (NULL==p) {
break;
}
k++;
if (m+1==k) {
q=p;//q为原链表第m个结点
}
s=p;//s为原链表尾结点
p=p->next;
}
s1=head->next;
head->next=q->next;
s->next=s1;
q->next=NULL;
//释放所有结点
p=head->next;//head为头结点
while(1){
if(!p){
printf("\n");
break;
}
else{
q=p->next;
free(p);
p=q;
}
}
//从小到大排序
for (p=head;p!=NULL && p->next!=NULL;p=p->next) {
for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {
if (p->next->data > q->next->data) {
//交换data
// printf("swap %02d %02d\n",p->next->data,q->next->data);
// t=p->next->data;p->next->data=q->next->data;q->next->data=t;
//或者交换next
// printf("swap %02d %02d\n",p->next->data,q->next->data);
s1=p->next;
s2=p->next->next;
s3=q->next;
s4=q->next->next;
if (s2!=s3) {
p->next=s3;
s3->next=s2;
q->next=s1;
s1->next=s4;
} else {
p->next=s3;
s3->next=s1;
q=s3;
s1->next=s4;
}