今日学习了链表的高级一点的操作,比如像把链表的尾指针挂到我想要的地方。然后对链表的排序什么的。具体就让我们来看一下题目吧。
这个题的意思是要一个双向链表。但是我当时并没有学习双向链表,于是我把一个链表的尾指针,挂在了它本身的头指针,形成了一个循环。操作是下方的代码。
LinkList coalition(LinkList L1){
Node * temp;
for(temp=L1;temp->next!=NULL;temp=temp->next);
temp->next=L1;
return L1;
}
然后就是我要进行的插入操作和删除操作。
for(b=l->next;b!=NULL;b=b->next){
if(l1==b){
break;
}
if(i==d-1){
l2=b->next;
b1=l2->next;
b->next=b1;
} if(i==1){
l1=b;
}
i++;
}
for(b=l->next;b!=NULL;b=b->next){
if(l3==b){
break;
}
if(i==e-1){
s->next=b->next;
b->next=s;
}if(i==1){
l3=b;
}
i++;
}
这都是单链表的基本操作。我是用了一个int变量来记录位置。
然后是一个记录位置并从一个我输入的位置开始输出。
for(b=l->next;b!=NULL;b=b->next){
if(i>=g){
if(m==b){
break;
}if(b->node!=0){
printf("%d ",b->node);}
}if(i==g){
m=b;
} i++;
}
接下来是完整的代码。
#include<stdio.h>
#include<malloc.h>
typedef struct a{
int node;
struct a *next;
}*LinkList,Node;
void CerateListTail(LinkList *L,int n)
{
LinkList p,r;
int i;
*L=(LinkList)malloc(sizeof(Node));
r=*L;
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(Node));
scanf("%d",&(p->node));
r->next=p;
r=p;
}
r->next=NULL;
}
LinkList coalition(LinkList L1){
Node * temp;
for(temp=L1;temp->next!=NULL;temp=temp->next);
temp->next=L1;
return L1;
}
int main()
{
LinkList a,b,l,s,m,l1,l2,b1,l3;
s=(LinkList)malloc(sizeof(Node));
int T;
int i=1;
char c ;
int d,e,f,g;
scanf("%d",&T);
CerateListTail(&a,T);
scanf("%c",&c);
scanf("%d",&d);
scanf("%d %d",&e,&f);
s->node=f;
scanf("%d",&g);
l=a;
a=a->next;
coalition(a);
for(b=l->next;b!=NULL;b=b->next){
if(l1==b){
break;
}
if(i==d-1){
l2=b->next;
b1=l2->next;
b->next=b1;
} if(i==1){
l1=b;
}
i++;
}
i=1;
for(b=l->next;b!=NULL;b=b->next){
if(l3==b){
break;
}
if(i==e-1){
s->next=b->next;
b->next=s;
}if(i==1){
l3=b;
}
i++;
}
i=1;
for(b=l->next;b!=NULL;b=b->next){
if(i>=g){
if(m==b){
break;
}if(b->node!=0){
printf("%d ",b->node);}
}if(i==g){
m=b;
} i++;
}
return 0;
}
今天的学习就是以上这些内容。