单链表的表示
typedef struct Lnode{
//声明结点的类型和指向结点的指针类型
ElemType data; //数据元素的类型
struct Lnode *next; //指示结点地址的指针
}Lnode, *LinkList;//结构体类型 和 指向 LNod结构体类型的指针
头节点之后才是首元结点
有了首元结点方便了在增加或删除第一位元素时的操作和其它位值相同。
查找链表的第i个元素
Status GetElem_L(LinkList L, int i, ElemType &e) {
p = L->next; j = 1; // 初始化,p 指向第一个结点,
// j 为计数器
while ( p && j < i ) {
p = p -> next; ++j;
} //此时p指向首元结点
if ( !p || j > i ) return ERROR; // 第 i 个元素不存在
e = p-> data; // 取第 i 个元素
return OK;
}
按值查找链表元素
Status GetElem_L1(LinkList L1, ElemType key)
{
p = L1 -> next;
while ( p && p -> data!=key) p = p -> next;//C语言的截断反应
return p;
} // GetElem_L1
插入链表的第i个元素e
Status ListInsert_L(LinkList &L, int i, ElemType e) {
p = L; j = 0;
while (p && j < i -1)
{ p = p ->next; ++j; }// 寻找第 i – 1 个结点
if (!p || j > i -1) return ERROR; // i 小于 1 或者大于表长+1, i<0
s = (LinkList) malloc ( sizeof (LNode)); // 生成新结点
s ->data = e;
s->next = p ->next; // 插入 L 中
p ->next = s;
return OK;
}
删除链表的第i个元素e
Status ListDelete_L(LinkList &L, int i, ElemType &e) {
p = L;
j = 0;
while ( p->next && j < i –1) {
p = p -> next; ++j; }
if (!(p -> next) || j > i –1) return ERROR; // 删除位置不合理
q = p -> next;
p -> next = q -> next; // 删除并释放结点
e = q -> data;
free(q);
return OK;
} // ListDelete_L
生成含有n个元素的单链表
头插法
void CreateList_L(LinkList &L, int n) {
// 逆位序输入 n 个元素的值,建立带表头结点的单链表 L。
L = (LinkList) malloc (sizeof (LNode));
L-> next = NULL; // 先建立一个带头结点的单链表
for (i = n; i > 0; --i) {
p = (LinkList) malloc (sizeof (LNode)); // 生成新结点
scanf(&p ->data); // 输入元素值
p ->next = L -> next;
L -> next = p; // 插入到表头
}
}
尾插法
void CreateList_L2(LinkList &L, int n) {
// 逆位序输入 n 个元素的值,建立带表头结点的单链表 L。
L = (LinkList) malloc (sizeof (LNode));
L-> next = NULL; // 先建立一个带头结点的单链表
last=L;
for (i = n; i > 0; --i) {
p = (LinkList) malloc (sizeof (LNode)); // 生成新结点
scanf(&p ->data); // 输入元素值
last->next =p;
last=last->next; // 插入到表尾 等价于last=p;
}
}