【时间复杂度会有些高吧】
1 int CSetCalculatorDlg::GetLengthOfLNode(LNode *PointerOfSet)
2 {
3 int length = 0;
4 while(PointerOfSet->next != NULL)
5 {
6 length++;
7 PointerOfSet = PointerOfSet->next;
8 }
9 return length;
10 }
11
12 int CSetCalculatorDlg::maxTime(int t)
13 {
14 int sum = 1;
15 for (int i = 0; i < t; i++)
16 {
17 sum *= 2;
18 }
19 return sum;
20 }
21
22 void CSetCalculatorDlg::PowerOfSet(LNode *PointerOfSet)
23 {
24 CString set = "Φ,";
25 CString setLeft = "{";
26 CString setRight = "}";
27 CString setSepChar = ",";
28 CString setTemp;
29
30 int lengthOfSet = GetLengthOfLNode(PointerOfSet);
31 int maxCirTime = maxTime(lengthOfSet);
32 int *Buffer = new int[lengthOfSet];
33
34 for(int k = 0; k < lengthOfSet; k++)
35 {
36 Buffer[k] = 0;
37 }
38
39 LNode *pointer;
40
41 int numTh = 0;
42 int index = 0;
43 int p = 0;
44
45 int lengthOfsetTemp = 0;
46 int lengthOfset = 0;
47
48 for (int i = 1; i < maxCirTime; i++)
49 {
50 pointer = PointerOfSet->next;
51 numTh = i;
52 index = 0;
53 do
54 {
55 Buffer[index] = numTh%2;
56 index++;
57 numTh = numTh/2;
58 } while (numTh);
59
60 setTemp = setLeft;
61 for (p = 0; p < lengthOfSet; p++)
62 {
63 if (Buffer[p])
64 {
65 setTemp = setTemp + pointer->data + setSepChar;
66 pointer = pointer->next;
67 }
68 else
69 {
70 pointer = pointer->next;
71 }
72
73 }
74 lengthOfsetTemp = setTemp.GetLength();
75 setTemp.Insert(lengthOfsetTemp-1,setRight);
76 set = set + setTemp;
77 setTemp.Empty();
78 }
79 lengthOfset = set.GetLength();
80 set.Delete(lengthOfset-1,1);
81 SetDlgItemText(IDC_EDIT_RESULTP,set);
82 set.Empty();
83
84 delete []Buffer;
85 Buffer = NULL;
86 }