单链表的数据结构
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
单链表的基本操作:
//创建单链表
LinkList CreateList();
//单链表的输出
Status ListTraverse(LinkList L);
//初始单链表
Status InitList(LinkList &L);
//销毁单链表
Status DestroyList(LinkList &L);
//将单链表重置为空表
Status ClearList(LinkList L);
//返回L中数据元素的个数
int ListLength(LinkList L);
//用e返回L中第i个元素的值
Status GetElem(LinkList L,int i,int &e);
//返回L中第一个与e满足compare()的数据元素的位序,如果不存在则返回0
int LocateElem(LinkList L,ElemType e,Status (*compare)(ElemType,ElemType));
//用pre_e返回L中cur_e(不是第一个)的前一个元素,否则操作失败,pre_e无定义
Status PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e);
//若cur_e是L的数据元素,且不是最后一个,则用next_e返回后继,否则操作失败,next_e无定义
Status NextElem(LinkList L,ElemType cur_e,ElemType &next_e);
//在L的第i个位置之前插入新的元素e
Status ListInsert(LinkList L,int i,ElemType e);
//删除L的第i个位置的元素,并用e返回删除的数值
Status ListDelete(LinkList L,int i,ElemType &e);
//将所用在线性表Lb中但不在La中数据元素插入到La中
void Union(LinkList La,LinkList Lb);
//La Lb中元素按值非递减排列,归并La和Lb得到新的链表也是非递减排列
void MergeList(LinkList La,LinkList Lb,LinkList &Lc);
具体的实现
LinkList CreateList()
{
int len;//创建链表的长度
LinkList L=(LinkList)malloc(sizeof(struct LNode));
LinkList p,q=L;
L->next=NULL;
printf("请输入单链表的长度:");
scanf("%d",&len);
for (int i=1;i<=len;++i)
{
p=(LinkList)malloc(sizeof(struct LNode));
printf("请输入第%d个元素:",i);
scanf("%d",&p->data);
q->next=p;
q=p;
}
q->next=NULL; //注意这部操作,很容遗忘
return L;
}
Status ListTraverse(LinkList L)
{
LinkList p=L->next;
while (p)
{
printf("%d ",p->data);
p=p->next;
}
return OK;
}
Status InitList(LinkList &L)
{
L=(LinkList)malloc((sizeof(LNode)));
if (!L)
{
exit(INFEASIBLE);
}
L->next=NULL;
return OK;
}
Status DestroyList(LinkList &L)
{
LinkList p;
while (L)
{
p=L->next;
free(L);
L=p;
}
return OK;
}
Status ClearList(LinkList L)
{
LinkList q,p=L->next;
while (p)
{
q=p->next;
free(p);
p=q;
}
L->next=NULL;//注意这里的操作不能忘记 不然遍历出现问题
return OK;
}
int ListLength(LinkList L)
{
int len=0;
LinkList p=L->next;
while (p)
{
++len;
p=p->next;
}
return len;
}
Status GetElem(LinkList L,int i,int &e)
{
LinkList p=L->next;
int j=1; //计数器的作用,通常p指针指到哪里便计数到哪里
while (p&&j<i)
{
p=p->next;++j;
}
if(!p||j>i) return ERROR;
e=p->data;
return OK;
}
int LocateElem(LinkList L,ElemType e,Status (*compare)(ElemType,ElemType))
{
int pos=0;
LinkList p=L->next;
while(p)
{
++pos;
if (compare(e,p->data))
{
return pos;
}
p=p->next;
}
return 0;
}
Status PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e)
{
LinkList q,p=L->next;
while (p->next)
{
q=p->next;
if(cur_e==q->data)
{
pre_e=p->data;
return OK;
}
p=q;
}
return ERROR;
}
Status NextElem(LinkList L,ElemType cur_e,ElemType &next_e)
{
LinkList q,p=L->next;
while (p->next)
{
q=p->next;
if(cur_e==p->data)
{
next_e=q->data;
return OK;
}
p=q;
}
return ERROR;
}
Status ListInsert(LinkList L,int i,ElemType e)
{
int j=0;
LinkList q,p=L; //注意删除和插入都是p=L 因为要指向操作的前一个元素
while (p&&j<i-1)
{
++j;
p=p->next;
}
if(!p||j>i-1) return ERROR;
q=(LinkList )malloc(sizeof(LNode));
q->data=e;
q->next=p->next;
p->next=q;
return OK;
}
Status ListDelete(LinkList L,int i,ElemType &e)
{
LinkList q,p=L;
int j=0;
while (p->next&&j<i-1)
{
++j;
p=p->next;
}
if(!p->next||j>i-1) return ERROR;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return OK;
}
void Union(LinkList La,LinkList Lb)
{
int elem;
int La_len=ListLength(La);
int Lb_len=ListLength(Lb);
for(int i=1;i<=Lb_len;++i)
{
GetElem(Lb,i,elem);
if(!LocateElem(La,elem,compare)) ListInsert(La,++La_len,elem);
}
}
void MergeList(LinkList La,LinkList Lb,LinkList &Lc)
{
LinkList pa,pb,pc;
pa=La->next;
pb=Lb->next;
pc=Lc=La;
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;}
}
pc->next=pa?pa:pb;
free(Lb);
}