1.单链表的表示:
//单链表中节点的表示
typedef struct LNode{ //定义单链表节点类型
ElemType data;
struct LNode *next;
} LNode,*LinkList;
2.单链表的初始化:
void InitList(LinkList &L){
L=(LinkList)malloc(sizeof(LNode));
L->next = NULL;
}
3.用头插法建立一个单链表:
//需要逆序输入数据
void List_HeadInsert(LinkList &L, int n){ //共有n个结点
InitList(L); //初始化,调用了上一个函数
LinkList p; //等价与 LNode *p;
for(i=1; i<=n; ++i){
p=(LinkList)malloc(sizeof(LNode)); //分配空间
scanf(p->data);
p->next = L->next;
L->next = p;
}
}
//插入一个结点时间复杂度为O(1),建立完整的链表为O(n)
4.用尾插法建立一个单链表
void List_TailInsert(LinkList &L,int n){
InitList(L);
LinkList p; LinkList r=L; //r为表尾指针
for(i=1; i<=n; ++i){
p=(LinkList)malloc(sizeof(LNode));
p->next = NULL;
scanf(p->data);
r->next = p;
r = r->next;
}
}
5.按序号查找结点值:
LinkList GetElem(LinkList L, int i){
LinkList p = L;
if (i<0) return NULL;
for(int j=1; j<=i; ++j){
if(p) return NULL; //若p为空,则下句p->next会报错
p=p->next;
++j;
}
return p;
}
6.按值查找表结点:
LinkList LocateElem(LinkList L, ElemType e){
LinkList p=L->next;
while(p->data!=e && p)
p=p->next;
// if(!p) return NULL; //可省略,p为空时,return p 即是return NULL;
return p;
}
7.插入结点:
int InsertLNode(LinkList &L, int i, ElemType e){
LinkList p = GetElem(L,i-1);
if(p) return false;
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
8.删除结点:
int DeleteLNode(LinkList &L, int i, ElemType &e){ //
LinkList p =GetElem(L,i-1);
if(p) return false;
// p->next = p->next->next; //这样做无法释放删除元素的空间,可以写成下面的形式:
LinkList q = p->next;
e = q->data; //把待删除元素的数据域传给e
q = p->next;
free(q)
return true;
}
9.求表长:(默认该表有头结点)
int Length(LinkList L){
LinkList p = L->next;
int i = 0;
while(p){
++i;
p=p->next;
}
return i
}