链表表示数的运算

  1. 题目
  2. 分析
  3. 实现

题目

用单向链表表示十进制整数,求两个正整数的和。如下,1234+77=1311,注意单向链表的方向。

1
2
3
4
1->2->3->4
+ 7->7
-----------
1->3->1->1

输入:

1
1234 77

分析

由于是单向链表,其操作顺序为从前往后,但由于十进制加法的特性要求我们从后往前计算,因此可以考虑先将链表反转,然后进行加法计算,得到结果后再次反转链表。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
typedef struct list {
struct list *next;
int data;
} list;

list *reverse(list *l)
{
list *prev = NULL;

while (l != NULL) {
list *next = l->next;
l->next = prev;
prev = l;
l = next;
}

return prev;
}

void release(list *l)
{
while (l != NULL) {
list *tmp = l->next;
free(l);
l = tmp;
}
}

list *list_add(list *l, int n)
{
list *tmp = l;
list *new;


new = malloc(sizeof(list));
if (new == NULL)
return NULL;

new->data = n;
new->next = NULL;

if (tmp == NULL)
return new;

while (tmp->next != NULL) {
tmp = tmp->next;
}
tmp->next = new;
return l;

}

void show(list *l)
{
list *tmp = l;
while(tmp != NULL) {
printf("%d", tmp->data);
tmp = tmp->next;
if (tmp == NULL) {
printf("\n");
} else {
printf("->");
}
}
}

list *add(list *a, list *b)
{
list *itera = a;
list *iterb = b;
int c = 0;

if (a == NULL || b == NULL)
return NULL;

while(1) {
itera->data += (iterb->data + c);
if (itera->data > 9) {
itera->data -= 10;
c = 1;
} else {
c = 0;
}

if(itera->next == NULL || iterb->next == NULL) {
break;
}

itera = itera->next;
iterb = iterb->next;
}

if (iterb->next != NULL) {
itera->next = iterb->next;
iterb->next = NULL;
}
if (c) {
itera->next->data++;
}

return a;
}

int main()
{
int num1[] = {1,2,3,4};
int num2[] = {7,7};
list *a,*b;
int i;
for (i = 0; i < sizeof(num1)/sizeof(int); i++) {
if ((a = list_add(a, num1[i])) == NULL) {
printf("list allocat error!\n");
return -1;
}
}

for (i = 0; i < sizeof(num2)/sizeof(int); i++) {
if ((b = list_add(b, num2[i])) == NULL) {
printf("list allocat error!\n");
return -1;
}
}

a = reverse(a);
b = reverse(b);

a = add(a, b);
a = reverse(a);
release(a);
release(b);
return 0;
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 yxhlfx@163.com

文章标题:链表表示数的运算

本文作者:红尘追风

发布时间:2015-09-12, 15:16:50

原始链接:http://www.micernel.com/2015/09/12/%E9%93%BE%E8%A1%A8%E8%A1%A8%E7%A4%BA%E6%95%B0%E7%9A%84%E8%BF%90%E7%AE%97/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录