简单链表
来源:互联网 发布:linux重启redmine服务 编辑:程序博客网 时间:2024/05/23 01:05
C++单链表基本操作(代码) #include <iostream> #include <stdlib.h> #include <assert.h> using namespace std; // list node structure typedef struct _NODE{ int data; struct _NODE *next; }NODE, *PNODE; // create a list, return the pointer to the head node PNODE create() { PNODE head = NULL; PNODE current = NULL; PNODE temp = NULL; int data = 0; int cnt = 1; temp = new NODE; assert(temp != NULL); cout << "Please input numbers, end with 0" << endl; cin >> data; temp->data = data; while(temp->data != 0) { if(cnt == 1) { // head node current = temp; head = current; }else{ current->next = temp; } current = temp; temp = new NODE; assert(temp != NULL); } current->next = NULL; // last node return head; } // print data of each node in the list, from head to tail void print(PNODE list) { if(!list) { cout << "empty list" << endl; return; } PNODE current = list; while(current) { cout << current->data << " "; current = current->next; } cout << endl; } // free each node in the list void destroy(PNODE &list) // pointer reference { if(!list) { cout << "destroy ok" << endl; return; } PNODE current = list; PNODE temp = NULL; while(current) { cout << "destroy " << current->data << endl; temp = current->next; delete current; current = temp; } list = current; cout << "destroy ok" << endl; } // count the nodes in the list int count(PNODE list) { if(!list) return 0; int cnt = 0; // traverse the list PNODE current = list; while(current) { ++cnt; current = current->next; } return cnt; } // find value in the list, return the position of the node(start from 1...) int find(PNODE list, int data) { if(!list) { cout << "value " << data << " not found in empty list" << endl; return 0; } int cnt = 0; PNODE current = list; // traverse the list while(current) { ++cnt; if(current->data == data) { // found cout << "find value " << data << " in node " << cnt << endl; return cnt; } current = current->next; } // not found cout << "value " << data << " not found" << endl; return 0; } // reverse the list(loop) void reverse_loop(PNODE &list) { if(!list) return; PNODE previous = NULL; PNODE current = NULL; PNODE next = NULL; previous = list; current = previous->next; while(current) { next = current->next; current->next = previous; previous = current; current = next; } // change head to tail list->next = NULL; list = previous; // cout << "reverse ok" << endl; } // reverse the list(recursive) PNODE reverse_rec(PNODE list) { if(!list) return NULL; PNODE tail = reverse_rec(list->next); if(!tail) return list; // find the last node of list // assume the rest of the list is reversed, we only need to reverse the first two nodes list->next->next = list; // the second node pointer to the first node list->next = NULL; // the first node pointer to NULL(new tail) return tail; // unchanged(new head) } // insert node in list void insert(PNODE &list, int data) { PNODE node = new NODE; assert(node != NULL); node->data = data; // test cout << "insert value " << data << endl; if(!list) { node->next = NULL; list = node; return ; } PNODE current = list; while(current->data < node->data && current->next) { // find the right position current = current->next; } if(current == list) { // insert before the first node node->next = current; list = node; return ; } node->next = current->next; current->next = node; return ; } // delete specified node(start from 0) void remove(PNODE &list, int pos) { if(!list) return ; PNODE current = list; if(pos == 0) { // remove first node list = current->next; cout << "delete first node " << current->data << endl; delete current; return ; } // find pos in list int cnt = 0; PNODE temp = NULL; while(current->next) { if(++cnt == pos) { // found temp = current->next; current->next = temp->next; cout << "delete node " << pos+1 << " with value " << temp->data << endl; delete temp; return ; } current = current->next; } // not found cout << "node " << pos+1 << " not found in list" << endl; return ; } // find the middle node of list(rounded-up) PNODE middle(PNODE list) { if(!list) return NULL; PNODE first = NULL; PNODE second = NULL; first = second = list; int pos = 1; while(second->next && second->next->next) { first = first->next; // step one by one second = second->next->next; // step two each time pos++; } cout<< "find middle node " << pos << "(" << count(list) << ") with value " << first->data << endl; return first; } // exchange two integers void exchange(int &i, int &j) { i ^= j; j ^= i; i ^= j; } // sort order(little -> big) void sort(PNODE &list) { if(list == NULL || list->next == NULL) return ; int temp = 0; PNODE current = list; int cnt = count(list); for(int i = 1; i < cnt; i++) { current = list; for(int j = 0; j < cnt - i; j++) { if(current->data > current->next->data) { exchange(current->data, current->next->data); } current = current->next; } } } // merge two sorted lists into one list PNODE merge_loop(PNODE list1, PNODE list2) { if(!list1) return list2; else if(!list2) return list1; PNODE new_list = NULL; if(list1->data <= list2->data) { new_list = list1; list1 = list1->next; }else{ new_list = list2; list2 = list2->next; } PNODE current = new_list; while(list1 && list2) { if(list1->data <= list2->data) { current->next = list1; list1 = list1->next; current = current->next; }else{ current->next = list2; list2 = list2->next; current = current->next; } } if(!list1) current->next = list2; if(!list2) current->next = list1; return new_list; } // merge two sorted lists into one list PNODE merge_rec(PNODE list1, PNODE list2) { if(!list1) return list2; else if(!list2) return list2; PNODE mlist = NULL; if(list1->data <= list2->data) { mlist = list1; mlist->next = merge_rec(list1->next, list2); }else{ mlist = list2; mlist->next = merge_rec(list1, list2->next); } return mlist; } // start from here int main() { // create PNODE slist = create(); PNODE slist2 = create(); cout << "after input: " << endl; print(slist); print(slist2); // sort cout << "after sorted: " << endl; sort(slist); sort(slist2); print(slist); print(slist2); // merge cout << "after merged: " << endl; // PNODE mlist = merge_loop(slist, slist2); PNODE mlist = merge_rec(slist, slist2); print(mlist); // find cout << "nodes of mlist: " << count(mlist) << endl; find(mlist, 0); find(mlist, 8); find(mlist, 20); // insert insert(mlist, 0); insert(mlist, 8); insert(mlist, 10); print(mlist); // middle middle(mlist); // remove remove(mlist, 0); remove(mlist, 8); remove(mlist, 10); print(mlist); // middle middle(mlist); // reverse reverse_loop(mlist); // mlist = reverse_rec(mlist); cout << "after reversed: " << endl; print(mlist); // destroy destroy(mlist); system("PAUSE"); return 0; }