链表的增删改
链表不是很熟,今天就写了增删改。如下。vs2013 编译通过
1 #include<iostream> 2 using namespace std; 3 struct ListNode 4 { 5 int m_value; 6 ListNode * m_pnext; 7 }; 8 ListNode * createLink(int a[], int k) 9 { 10 ListNode* Head = NULL, *q = NULL; 11 //利用尾插法进行插入 12 for (int i = 0; i < k; ++i) 13 { 14 ListNode* p_new = new ListNode(); 15 p_new->m_value = a[i]; 16 p_new->m_pnext = NULL; 17 if (q == NULL) 18 { 19 Head = p_new; 20 q = p_new; 21 } 22 else 23 { 24 q->m_pnext = p_new; 25 q = q->m_pnext;//跟踪最后的节点 26 } 27 28 } 29 return Head; 30 } 31 //从头到尾打印单链表 32 void printLink(ListNode* phead) 33 { 34 ListNode* p = phead; 35 cout << "链表的内容是 : " << endl; 36 while (p) 37 { 38 cout << p->m_value << " "; 39 p = p->m_pnext; 40 } 41 cout << endl; 42 43 } 44 45 void removeNode(ListNode** phead, int value) 46 { 47 //二级指针和 二级指针里面指示的值,都为空 48 //应该先处理第一个节点, 然后在while循环里面处理第二个节点。 49 if (*phead == NULL || phead == NULL) 50 { 51 return; 52 } 53 ListNode* tobedeleted; 54 if ((*phead)->m_value == value) 55 { 56 tobedeleted = *phead; 57 *phead = (*phead)->m_pnext; 58 delete tobedeleted; 59 } 60 else 61 {// 如果不是第一个节点的话, 找到要删除的节点的前驱,记录当前要删除的节点。改变指针方向 删除。 62 ListNode* ppre = NULL, *pcur = *phead; 63 while (pcur && pcur->m_value != value) 64 { 65 ppre = pcur; 66 pcur = pcur->m_pnext; 67 } 68 tobedeleted = pcur; 69 ppre->m_pnext = pcur->m_pnext; 70 delete tobedeleted; 71 } 72 } 73 //从大 74 void addElement(ListNode** phead, int value) 75 { 76 ListNode* pnew = new ListNode(); 77 pnew->m_value = value; 78 if (pnew->m_value < (*phead)->m_value) 79 { 80 pnew->m_pnext = *phead; 81 *phead = pnew; 82 } 83 else 84 { 85 ListNode* pcur = *phead, *ppre = NULL; 86 //把找位置直接写在一个循环里面 87 while (pcur && pcur->m_value < pnew->m_value) 88 { 89 ppre = pcur; 90 pcur = pcur->m_pnext; 91 } 92 ppre->m_pnext = pnew; 93 pnew->m_pnext = pcur; 94 } 95 } 96 void changeElement(ListNode** phead, int value, int change) 97 { 98 ListNode* pcur = *phead; 99 while (pcur && pcur->m_value != value) 100 { 101 pcur = pcur->m_pnext; 102 } 103 if (pcur == NULL) 104 { 105 cout << "找不到你要修改的值" << endl; 106 } 107 else 108 { 109 pcur->m_value = change; 110 } 111 } 112 113 int main() 114 { 115 //int arr[] = { 0x01020304, 0x41424344 }; 116 //cout << hex << *(int*)((char*)arr + 1); 117 //0403020144434241 118 int a[] = { 1, 2, 3, 4, 5 }; 119 ListNode* head = createLink(a, 5); 120 printLink(head); 121 removeNode(&head, 5); 122 printLink(head); 123 removeNode(&head, 1); 124 addElement(&head, 6); 125 addElement(&head, 1); 126 addElement(&head, 0); 127 changeElement(&head, 0, 9); 128 printLink(head); 129 130 system("pause"); 131 }