前面代码重复写了多次了,就省略了...... boolListInsert(LinkList &L, int i, ElemType e){ // 基本思路和上面是相同的,区别就是在插入第1个元素的时候需要特殊处理 if (i < 1) returnfalse;' if (i == 1) { LNode *s = (LNode *)malloc(sizeof LNode); s -> data = e; s -> NEXT = L; L = s; returntrue; } LNode *p; int j = 0; p = L; while (p != NULL && j < i - 1) { p = p -> next; j++; } if (p == NULL) returnfalse; LNode *s = (LNode *)malloc(sizeof LNode); s->data = e; s->NEXT=p->NEXT; p->NEXT=s; returntrue; }
前面代码重复写了多次了,就省略了...... boolListInsert(LinkList &L, int i, ElemType e){ if (i < 1) returnfalse;' if (i == 1) { LNode *s = (LNode *)malloc(sizeof LNode); s -> data = e; s -> NEXT = L; L = s; returntrue; } LNode *p; int j = 0; p = L; while (p != NULL && j < i) { // 唯一的区别,遍历到第i个元素,之前是遍历到第i - 1个元素 p = p -> next; j++; } if (p == NULL) returnfalse; LNode *s = (LNode *)malloc(sizeof LNode); s->data = e; s->NEXT=p->NEXT; p->NEXT=s; returntrue; }
指定节点前插操作(在一个结点前面插入一个元素,这里可以使用一个新思路)
代码(现在假定我们已经知道了我们的目标结点)
1 2 3 4 5 6 7 8 9 10
boolInsertPriorNode(LNode *p, LNode *s) { // 看下图,我们现在的目标是在p的前面插入元素e,下面代码的基本思路就是首先将s结点插入到p指向结点后面,然后再将p和s结点位置交换一下即可 if (p == NULL || s == NULL) returnfalse; s -> NEXT = p -> NEXT; p -> NEXT = s; // 下面三步将两个结点的元素进行交换 ElemType temp = p -> data; p -> data = s -> data; s -> data = temp; returntrue }
按位序删除(带头结点)
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
boolListDelete(LinkList &L,int i, ElemType &e) { if (i < 1) returnfalse; LNode *p; int j = 0; p = L; while (p != NULL && j < i - 1) { p = p -> NEXT; j ++; } if (p == NULL || p ->NEXT == NULL) returnfalse;
// 正式开始删除元素,前面全是判断是否可以删除。 LNode *q = p -> NEXT; // q存放需要删除的元素 e = q -> data; // 由于使用的类型用了&,所以可以将删除元素存下来 p -> NEXT = q -> NEXT; free(p); returntrue; }
boolDeleteNode(LNode *p) { if (p == NULL) returnfalse; if (p -> NEXT == NULL) { // 当需要删除的元素是单链表最后一个元素的时候 free(p); // 空间释放完之后就OK了 } LNode *q = p -> NEXT; p -> data = p -> NEXT -> data; p -> NEXT = q -> NEXT; free(p); returntrue; }
按位查找(返回第i个元素,如果你前面的知识都掌握了,这里应该自己就可以实现了)
代码
1 2 3 4 5 6 7 8 9 10 11
LNode * GetElem(LinkList L, int i) { if (i < 0) returnNULL; LNode *p; int j = 0; p = L; while (p != NULL && j < i) { p = p -> NEXT; j++; } return p; }
LNode * LocateElem(LinkList L,ElemType e) { LNode *p = L -> NEXT; while (p != NULL && p -> data != e) { p = p -> NEXT; } return p; }
求表的长度
代码
1 2 3 4 5 6 7 8 9
intlength(LinkList L) { int len = 0; LNode *p = L; while (p -> NEXT != NULL){ p = p -> NEXT; len ++; } return len; }
尾插法
代码
1 2 3 4 5 6 7 8 9
boolInsertNextNode(LNode *p, ElemType e) { if (p == NULL) returnfalse; LNode *s = (LNode *)malloc(sizeof LNode); if (s == NULL) returnfalse; s -> data = e; s -> NEXT = p -> NEXT; p -> NEXT = s; returntrue; }
下面代码可以看明白即可
头插法
头结点的后插操作
代码
1 2 3 4 5 6 7 8 9
boolInsertNextNode(LNode *p, ElemType e) { if (p == NULL) returnfalse; LNode *s = (LNode *)malloc(sizeof LNode); if (s == NULL) returne false; // 可有可无 s -> data = e; s -> NEXT = p -> NEXT; p -> NEXT = s; returntrue; }