您的位置:首页 > 理论基础 > 数据结构算法

数据结构基础3_带头结点的单链表

2015-10-13 12:51 633 查看
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef int Status;
#define true 1
#define false 0
typedef struct Lnode{
ElemType data;
struct Lnode *next;
}*link,*Position;
typedef struct{
link head,tail;
int len;
}linklist;
Status Makenode(link &p,ElemType e)
{
p=(link)malloc(sizeof(Lnode));
if(!p)
{
return false;
}
p->data=e;
return true;
}
void Freenode(link &p)
{
free(p);
p=NULL;
}
Status Initlist(linklist &L)
{
link p;
p=(link)malloc(sizeof(Lnode));
if(!p)
{
return false;
}
p->next=NULL;
L.head=L.tail=p;
L.len=0;
return true;
}
Status Clearlist(linklist &L)
{
link p,q;
p=L.head->next;
L.head->next=NULL;
while(p!=NULL)
{
q=p->next;
free(p);
p=q;
}
L.tail=L.head;
L.len=0;
return true;
}
Status Destorylist(linklist &L)
{
Clearlist(L);
free(L.head);
L.head=L.tail=NULL;
L.len=0;
return true;
}
Status Insfirst(linklist &L,link h,link s)
{
h=L.head;
s->next=h->next;
h->next=s;

L.len++;
return true;
}
Status Delfirst(linklist &L,link h,link q)
{
h=L.head;
if(h->next==NULL)
{
return false;
}
q=h->next;
h->next=q->next;
free(q);
L.len--;
return true;
}
Status Append(linklist &L,link s)
{
int n=1;
link p;
p=L.head;
while(p->next!=NULL)
{
p=p->next;
}
p->next=s;
while(s->next!=NULL)
{
s=s->next;
n++;
}
L.tail=s;
L.len+=n;
}
Status Remove(linklist &L,link &q)
{
link p;
p=L.head;
if(L.head==L.tail)
{
return false;
}
q=L.head;
while(q->next!=NULL)
{
q=q->next;
}
while(p->next!=q)
{
p=p->next;
}
p->next=q->next;
L.tail=p;
L.len--;
return true;
}
Status Insbefore(linklist &L,link &p,link s)
{
link q=L.head;
while(q->next!=p)
{
q=q->next;
}
s->next=q->next;
q->next=s;
p=s;
L.len++;
return true;
}
Status Insafter(linklist &L,link &p,link s)
{
s->next=p->next;
p->next=s;
if(p==L.tail)
{
L.tail=s;
}
p=s;
L.len++;
return true;
}
Status Setcurelem(link &p,ElemType e)
{
p->data=e;
return true;
}
ElemType Getcurelem(link p)
{
return p->data;
return true;
}
Status Listempty(linklist L)
{
if(L.head->next==NULL)
{
return true;
}
else
{
return false;
}
}
int Listlength(linklist &L)
{
return L.len;
}
Position Gethead(linklist L)
{
return L.head;
}
Position Getlast(linklist L)
{
return L.tail;
}
Position priorpos(linklist L,link p)
{
link pre=L.head;
while(pre->next!=p)
{
pre=pre->next;
}
if(L.head==pre)
{
return NULL;
}
return pre;
}
Position Nextpos(linklist L,link p)
{
/*
if(L.tail==p)
{
return NULL;
}*/
return p->next;
}
Status Locatepos(linklist L,int i,link &p)
{
if(i<0||i>L.len)
{
return false;
}
p=L.head;
while(i!=0)
{
i--;
p=p->next;
}

return 1;
}
int compare(ElemType e1,ElemType e2)
{
if(e1>e2)
{
return 1;
}
if(e1==e2)
{
return 0;
}
else
{
return -1;
}
}

Position Locateelem(linklist L,ElemType e,Status compare(ElemType,ElemType))
{
int j;
link p;
p=L.head->next;
for(int i=0;i<L.len;i++)
{
if(compare(e,p->data)==0)
{
return p;
}
p=p->next;
}
return NULL;
}
Status visit(link p)
{
printf("%d",p->data);
}
Status Listtraverse(linklist &L,Status visit(link p))
{
link p=L.head->next;
while(p!=NULL)
{
visit(p);
p=p->next;
}
return true;
}
Status Listinsert(linklist &L,int i,ElemType e)
{
link h,s;
if(!Locatepos(L,i-1,h))
{
return false;
}
if(!Makenode(s,e))
{
return false;
}
if(h==L.tail)
{
L.tail=s;
}
Insfirst(L,h,s);
return true;
}

void mergelist(linklist &La,linklist &Lb,linklist &Lc)
{
link pa,pb,pc;
pa=La.head->next;
pb=Lb.head->next;
Lc.head=pc=La.head;
while(pa && pb)
{
if(pa->data <= pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
if(pa==NULL)
{
pc->next=pb;
}
else
{
pc->next=pa;
}

}
#include<stdio.h>
#include<stdlib.h>
int main()
{
linklist La;
Initlist(La);
Listinsert(La,1,7);
Listinsert(La, 2, 5);
Listinsert(La, 3, 2);
Listinsert(La, 4, 1);

linklist lb;
Initlist(lb);
Listinsert(lb,1,39);
Listinsert(lb,2,19);
Listinsert(lb,3,9);
Listinsert(lb,4,3);
/*
link h,q,k;

Delfirst(La,h,q);

Remove(La,k);*/
linklist lc;
mergelist(La,lb,lc);
Listtraverse(lc,visit);
printf("\n");
system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: