创建链表的方法:
STNode* CreateLink(int a[],int n)
{
int i;
STNode* h,*t,*p;
h=NULL;
for(i=0;i<n;i++)
{
p=(STNode*)malloc(sizeof(STNode));
p->data=a[i];
p->next=NULL;
if(!h)
h=t=p;
else
t=t->next=p;
}
return h;
}
STNode* CreateLink(int a[],int n)
{
STNode* h,*p,*t;
h=NULL;
while(n>-1)
{
p=(STNode*)malloc(sizeof(STNode));
p->data=a[--n];
p->next=h;
h=p;
}
return h;
}
STNode* CreateLink(int a[],int n)
{
int i;
STNode* h,*p,t;
h=NULL;
for(i=0;i<n;)
{
p=(STNode*)malloc(sizeof(STNode));
p->next=NULL;
if(!h)
h=t=p;
else
{
p->data=a[i];
t=t->next=p;
++i;
}
}
return h;
}
STNode* CreateLink(int a[],int n)
{
STNode *h=NULL;
if(n){
h=(STNode*)malloc(sizeof(STNode));
h->data=a[0];
h->next=CreateLink(a+1,n-1);
}
return h;
}
STNode* CreateLink(int a[],int n)
{
int i;
STNode *h,*t,*p;
h=NULL;
for(i=0;i<n;++i)
{
p=(STNode*)malloc(sizeof(STNode));
p->data=a[i];
if(!h)
h=t=p->next=p;
else
{
p->next=h;
t=t->next=p;
}
}
return h;
}
单链表的遍历
void Exchange(STNode *h)
{
int temp;
STNode* p;
for(p=h;p->next;p=p->next);
if(h-p){
temp=h->data;
h->data=p->data;
p->data=temp;
}
}
void PrePrintLink(STNode* h)
{
STNode *p,*end=NULL;
while(end-h)
{
for(p=h;p->next-end;p=p->next);
printf("%5d",p->data);
end=p;
}
}
void PrePrintLink(STNode* h)
{
int s[1000],cnt=0;
STNode *p;
for(p=h;p;p=p->next)
s[cnt++]=p->data;
for(;cnt>0;--cnt)
printf("%5d",s[cnt-1]);
}
void PrePrintLink(STNode* h)
{
if(h)
{
PrePrintLink(h->next);
printf("%5d",h->data);
}
}
STNode* PreLink(STNode* h)
{
STNode *s,*p;
s=h->next;
h->next=NULL;
while(s)
{
p=s;
s=s->next;
p->next=h;
h=p;
}
return h;
}
STNode* PreLink(STNode* h)
{
STNode *p,*hn=NULL;
while(h)
{
p=h;
h=h->next;
p->next=hn;
hn=p;
}
return hn;
}
STNode* PreLink(STNode* h)
{
STNode *p,*q=h->next;
while(q->next)
{
p=q->next;
q->next=p->next;
p->next=h->next;
h->next=p;
}
return h;
}
STNode* ClearLink(STNode* h)
{
STNode *delp;
while(h)
{
delp=h;
h=h->next;
free(delp);
}
return NULL;
}
void delete(STNode* h)
{
STNode *q,*p;
q=h;
p=h->next;
while(p)
{
if(p->data-q->data)
{
q=p;
p=p->next;
}
else
{
q->next=p->next;
free(p);
p=q->next;
}
}
}
void delete(STNode* h)
{
STNode* pkey,*p,*q;
pkey=h;
while(pkey)
{
q=pkey;
p=q->next;
while(p)
{
if(p->data-q->data)
{
q=p;
p=p->next;
}
else
{
q->next=p->next;
free(p);
p=q->next;
}
}
pkey=pkey->next;
]
}
STNode* Move(STNode* h)
{
STNode *p,*q;
q=h; p=q->next;
while(p)
{
if(p->data%2)
{
q->next=p->next;
p->next=h;
h=p;
p=q->next;
}
else
{
q=p;
p=p->next;
}
}
return h;
}
STNode* Combine(STNode* h1,STNode* h2)
{
STNode *ins,*p,*q;
while(h2)
{
ins=h2;
h2=h2->next;
for(p=h1;p&&p->data<ins->data;q=p,p=p->next);
ins->next=p;
if(p-h1)
q->next=ins;
else
h1=ins;
}
return h1;
}
- p指向一个单链表的某个节点(非头非尾),删除该节点。(未提供头指针)
q=p->next;
t=p->data;
p->data=q->data;
q->data=t;
p->next=q->next;
free(q);
链表的交点问题
STNode* Process(STNode* h1,STNode* h2)
{
int l,l1,l2;
STNode *p1,*p2;
l1=l2=0;
for(p1=h1;p1;p1=p1->next,++l1);
for(p2=h2;p2;p2=p2->next,++l2);
p1=h1; p2=h2; l=l1-l2;
if(l1<l2){
l=-l;
p1=h2;
p2=h1;
}
for(;l;p1=p1->next,--l);
for(;p1-p2;p1=p1->next,p2=p2->next);
return p1;
}
bool Judge(STNode *h)
{
STNode *slow,*fast;
slow=fast=h;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(fast==slow)
return true;
}
return false;
}
STNode* Find(STNode *h)
{
STNode *slow,*fast;
slow=fast=h;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(fast==slow) break;
}
if(fast!=slow) return NULL;
fast=h;
while(fast-slow)
{
fast=fast->next;
slow=slow->next;
}
return fast;
}