//4、销 //L=NULL相当于已释放节点,不需要free(L) voidDestroyList(LinkList &L){ LNode *p; while(L!=NULL){ p = L; L = L -> next; free(p); } }
//5、增 //不带头节点的插入操作,在第i个位置插入元素e boolListInsert(LinkList& L, int i, int 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;//不在第一个位置插入; p = L; int j = 1; while (p!=NULL && j<i-1) { p = p->next; j++; } if (p==NULL) returnfalse; returnInsertNextNode(p, e); }
//按位查找,不带头节点 LNode* GetElem(LinkList L, int i) { if (i < 1) { returnfalse; } int j = 1; LNode* p = L; while (p&& j < i) { p = p->next; j++; } return p; } //按值查找 LNode* LocateElem(LinkList L, int e) { LNode* p = L; while (p && p->data != e) { p = p->next; } return p; } //统计单链表的长度 intLength(LinkList) { int len = 0; LNode* p = L; while (p) { len++; p = p->next; } return len; } //后插操作。在节点p之后插入元素e boolInsertNextNode(LNode* p, int e) { if (!p) { returnfalse; } LNode* s = (LNode*)malloc(sizeof(LNode)); if (!s) { returnfalse; } s->data = e; s->next = p->next; p->next = s; returntrue; }
//前插操作,在p节点前插入元素e boolInsertPriorNode(LNode* p, int e) { if (!p) { returnfalse; } LNode* s = (LNode*)malloc(sizeof(LNode)); if (!s) { returnfalse; } s->next = p->next; p->next = s; s->data = p->data; p->data = e; returntrue; } //前插操作,在p节点前插入节点s; boolInsertPriorNode(LNode* p, LNode* s) { if (!p || !s) { returnfalse; } s->next = p->next; p -> next = s; swap(s->data, p->data); returntrue; } //删除位序为i的节点,e是i节点的值 boolListDelete(LinkList& L, int i, int& e) { if (L == NULL) { e = -1; returnfalse; } if (i < 1) { returnfalse; } if (i > 1) { LNode* p = GetElem(L, i - 1);//安值查找,找到数据域等于e的节点 if (!p || !(p->next)) { returnfalse; } LNode* q = p->next;//q指针指向位序为i的节点 e = q->data;//将数值复制给e, p->next = q->next;//p指针跳过q指针指向下一个节点 free(q);//这时q指针变为一个空节点,将这个结点释放 } else//i==1; { if (L->next == NULL)//只有一个头节点,直接将这个节点变为空, { e = L->data; L = NULL; } else//L->next!==NULL;//头节点后还有节点,将下一个节点变为头节点. { e = L->data; L = L->next; } } returntrue; } //删除指定节点P,核心在于找p的下一个节点,将下一个节点的值覆盖P节点,p指向下下一个节点。 boolDeleteNode(LNode* p) { if (p->next == NULL)//bug,不能删除最后一个节点 { returnfalse; } LNode* q = p->next; p->data = q->data; p->next = q->next; free(q); returntrue; } //尾插法创建不带节点的单链表 LinkList List_Taillnsert(LinkList& L) { InitList(L); int x = 0; cout << "请输入数据" << endl; cin >> x; LNode* s, * r = L;//r=L->next; while ( x!= 9999) { s = (LNode*)malloc(sizeof(LNode)); s->data = x; s->next = NULL; if (L == NULL) {//第一次插入,L==NULL; L = s;//将覆盖L; r = s;//指针还是指向最后 } else {//从第二此插入开始,L!=NULL r->next = s;//此次表尾指针指向最后 r = s;// } cin >> x; } r->next = NULL;//退出的时候表尾指针指向NULL return L; } voidprint(LinkList L)//打印单链表 { LNode* s = L; while (s != NULL) { cout << s->data << " "; s = s->next; } cout << endl; }
//3、增 boolListInsert(LinkList &L, int i, ElemType e){ if(i<1) returnfalse; LNode *p; //指向当前扫描节点 int j = 0; //当前p指向第几个节点 p = L; //L指向头结点,第0个节点 while(p!=NULL && j<i-1){ //循环找到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; }