链表的增删改

       链表不是很熟,今天就写了增删改。如下。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 }

 

posted @ 2015-01-23 12:49  cbeigong  阅读(196)  评论(0)    收藏  举报