1.链表的定义
typedef struct LNode{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList; // LinkList为指向结构体LNode的指针类型
2.链表的查找
在带头结点的单链表L中获取第i个元素的值赋给e,i的取值范围[1,n]
//算法:用一个计数器j记录,用while循环实现链表的遍历
void LL_GetAt(LinkList L, int i, ElemType &e)
{
int j=1;
LNode *p;
p=L->next;
while(p!=NULL&&j<i)
{
p=p->next;
j++;
}
e=p->data;
}
在带头结点的单链表L中查找第一个值为e的元素,找到则将该元素在链表中的位置赋给i,并返回该结点指针,否则i赋值为0并返回空指针
//算法:与上题相同
LNode *LL_FindValue(LinkList L, ElemType e,int &i)
{
LNode *p;
int j=1;
p=L->next;
while(p!=NULL&&P->data!=e)
{p=p->next;
j++;
}
if(p!=NULL)
{i=j;
return p;}
else{
i=0;
return NULL;}
}
3.链表的增删(两个节点)
在带头结点的单链表L中第i个位置插入值为e的新元素,i的取值范围[1,n+1]
//算法:先查找后插入s->data=e;s->next=p->next;p->next=s;
void LL_DelAt(LinkList L,int i)
{
LNode *p,*s;
int j=1;
p=L;
while(p!=NULL&&j<i)
{
p=p->next;
j++;
}//定位
if(p!=NULL){
s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
}
}
在带头结点的单链表L中,删除第i个元素,i的取值范围[1,n]
//算法:先查找后删除s=p->next;x=s->data;p->next=s->next;free(s);
void LL_DelAt(LinkList L,int i)
{
LNode *p,*s;
int j=1;
p=L;
ElemType x;
while(p!=NULL&&j<i)
{
p=p->next;
j++;
}
if(p!=NULL)
{ s=p->next;
x=s->data;
p->next=s->next;
free(s);
}
}
删除第一个值为e的数据元素
//算法:先查找后删除p->next=s->next
void LL_DelValue(LinkList L, ElemType e)
{LNode *p,*s;
ElemType x;
p=L;s=p->next;
while(s!=NULL&&s->data!=e)
{ p=s;
s=s->next;
}
if(s!=NULL)
{
p->next=s->next;
}
}
4.链表的合并
已知单链表LA和LB的元素按值非递减排列,归并LA和LB得到新的单链表LC,LC的元素也按值非递减排列
//算法:三个结点指针,相当于构建链表
void MergeList_L(LinkList LA,LinkList LB,LinkList &LC)
{LNode *p,*r,*t;
LC=(LinkList)malloc(sizeof(LinkList));
LC->next=NULL;
t=LC;
p=LA->next;r=LB->next;
while(p!=NULL&&r!=NULL)
{
if(p->data<r->data)
{
t->next=p;
t=t->next;
p=p->next;
}
else{
t->next=r;
t=t->next;
r=r->next;
}
}
if(p!=NULL){t->next=p;}
if(r!=NULL){t->next=r;}
}