单链表的熟悉使用,注意测试用例的全面
//使用引用的作用等同于使用二级指针,在传递指针时 //传引用是可能改变Link,而有的函数只需改变->next,此时不需传引用 #include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<assert.h> typedef int DataType; typedef struct LinkNode { DataType _data;//节点数据 struct LinkNode* _next;//指向下一个节点的指针 }LinkNode, *PLinkNode; void InitList(PLinkNode& PLinkhead);//初始化 void PrintList(PLinkNode PLinkhead);//打印 int GetLinkNode(PLinkNode PLinkhead);//获取节点数 void DestoryNode(PLinkNode& PLinkhead);//销毁链表 void PushBack(PLinkNode& PLinkhead, DataType x);//尾插 void PopBack(PLinkNode& PLinkhead);//尾删 void PushFront(PLinkNode& PLinkhead, DataType x);//头插 void PopFront(PLinkNode& PLinkhead);//头删 PLinkNode Find(PLinkNode PLinkhead, DataType x);//查找x的位置 void Erase(PLinkNode& PLinkhead, PLinkNode pos);//删除pos处的节点 void EraseNoTaiNode(PLinkNode pos);//无头指针删除,可采用拷贝下一个结点数据,删除下一个结点 void Insert(PLinkNode pos, DataType x);//在pos后面插入一个节点 void Remove(PLinkNode& PLinkhead, DataType x);//删除链表中的第一个x void RemoveAll(PLinkNode& PLinkhead, DataType x);//删除链表中所有的x void Test();//测试 PLinkNode BuyNode(DataType x);//开辟PLinkNode空间存储x PLinkNode BuyNode(DataType x) { PLinkNode tmp; tmp=(PLinkNode)malloc(sizeof(LinkNode)); tmp->_data = x; tmp->_next = NULL; return tmp; } void InitList(PLinkNode& PLinkhead) { PLinkhead = NULL; } void PrintList(PLinkNode PLinkhead) { PLinkNode cur=PLinkhead; while (cur != NULL) { printf("%d->", cur->_data); cur = cur->_next; } printf("NULL\n"); } int GetLinkNode(PLinkNode PLinkhead) { int count = 0; PLinkNode cur = PLinkhead; while (cur != NULL) { count++; cur = cur->_next; } return count; } void DestoryNode(PLinkNode& PLinkhead) { PLinkNode del = PLinkhead; while (PLinkhead!= NULL) { del = PLinkhead; PLinkhead = PLinkhead->_next; free(del); } } void PushBack(PLinkNode& PLinkhead, DataType x) { if (PLinkhead == NULL) { PLinkhead = BuyNode(x); } else { PLinkNode end =PLinkhead; while (end->_next != NULL) { end = end->_next; } end->_next = BuyNode(x); } } void PopBack(PLinkNode& PLinkhead) { if (PLinkhead == NULL) { return; } else if (PLinkhead->_next == NULL) { free(PLinkhead); PLinkhead = NULL; } else { PLinkNode end=PLinkhead,pre=NULL; while (end->_next != NULL) { pre = end; end = end->_next; } pre->_next = NULL; free(end); } } void PushFront(PLinkNode& PLinkhead, DataType x) { if (PLinkhead == NULL) { PLinkhead = BuyNode(x); } else { PLinkNode start = BuyNode(x); start->_next = PLinkhead; PLinkhead = start; } } void PopFront(PLinkNode& PLinkhead) { if (PLinkhead == NULL) { return; } else if (PLinkhead->_next == NULL) { free(PLinkhead); PLinkhead = NULL; } else { PLinkNode end = PLinkhead; PLinkhead = PLinkhead->_next; free(end); } } PLinkNode Find(PLinkNode PLinkhead, DataType x) { PLinkNode cur = PLinkhead; while (cur) { if (cur->_data == x) return cur; else cur = cur->_next; } return NULL; } void Erase(PLinkNode& PLinkhead, PLinkNode pos) { assert(pos); PLinkNode pre = PLinkhead; assert(pos); if (pos == PLinkhead) { PLinkhead = pos->_next; free(pos); } else { while (pre&&pre->_next != pos) { pre = pre->_next; } if (pre) { pre->_next = pos->_next; free(pos); } else printf("为找到此位置\n"); } } void EraseNoTaiNode(PLinkNode pos)//删除一个非尾节点的无头节点 { PLinkNode del = pos->_next;//保存pos的下一节点 pos->_data = pos->_next->_data; pos->_next = del->_next; free(del); } void Insert(PLinkNode pos, DataType x)//在pos后面插入x { PLinkNode cur = BuyNode(x); if (pos == NULL) { printf("插入位置错误\n"); return; } cur->_next = pos->_next; pos->_next = cur; } void Remove(PLinkNode& PLinkhead, DataType x) { PLinkNode cur = PLinkhead,pre=NULL; if (PLinkhead->_data == x) { PLinkhead=PLinkhead->_next; free(cur); } else { while (cur&&cur->_data != x) { pre = cur; cur = cur->_next; } if (cur) { pre->_next= cur->_next; free(cur->_next); } } } void RemoveAll(PLinkNode& PLinkhead, DataType x) { PLinkNode cur = PLinkhead, pre = NULL; if (cur->_data == x) { PLinkhead = PLinkhead->_next; free(cur); } cur = PLinkhead; while (1) { while (cur&&cur->_data != x) { pre = cur; cur = cur->_next; } if (cur) { pre->_next = cur->_next; free(cur); cur = pre->_next; } else return; } } void Test() { PLinkNode Link; InitList(Link); PushBack(Link,3); PushBack(Link, 2); PushBack(Link, 3); PushBack(Link, 4); PrintList(Link); PushFront(Link, 5); PushFront(Link, 6); PushFront(Link, 7); PrintList(Link); EraseNoTaiNode(Find(Link, 2)); PrintList(Link); Insert(Find(Link, 2), 5); PrintList(Link); Insert(Find(Link, 3), 5); PrintList(Link); Remove(Link, 1); Remove(Link, 4); PrintList(Link); RemoveAll(Link, 3); PrintList(Link); DestoryNode(Link); PrintList(Link); } int main() { Test(); system("pause"); return 0; }
时间: 2024-10-12 22:06:20