自己来尝试把这些算法写下来, 供参考, 如有误,请指出,谢谢。
1. BD小题
单向链表排序(不限算法)
typedef struct Node
{
NSUInteger numData;
struct Node *nextNode;
}LinkNode;
// 用来显示,看是否成功
- (void)showLink:(LinkNode *)theLink{
struct Node *tmp = theLink;
for (; tmp->nextNode != NULL; tmp = tmp->nextNode) {
NSLog(@"cur node numData=%d", tmp->numData);
}
}
- (void)sortTheLink:(LinkNode *)theLink {
if (theLink == NULL) {
return;
}
LinkNode *p = theLink;
LinkNode *q = NULL;
for (; p->nextNode != NULL; p=p->nextNode) {
q = p->nextNode;
for (; q != NULL; q = q->nextNode) {
if (p->numData > q->numData) {
NSInteger tem = q->numData;
q->numData = p->numData;
p->numData = tem;
}
}
}
}
- (void)btnClicked:(id)sender {
// 创建链接
LinkNode *head = (LinkNode *)malloc(sizeof(LinkNode));
head->numData =0;
head->nextNode =NULL;
LinkNode *tmp = head;
for (NSInteger i=0; i<10; i++) {
// 随意给10个结点,后面将对它们中的内容进行排序
LinkNode *singleNode = (LinkNode *)malloc(sizeof(LinkNode));
if (i<5) {
singleNode->numData =19-i;
}else {
singleNode->numData =9-i;
}
tmp->nextNode = singleNode;
singleNode->nextNode =NULL;
tmp = singleNode;
}
[selfshowLink:head];
[selfsortTheLink:head];
[selfshowLink:head];
}
2013-05-07 19:06:52.387 listTe[2542:11303] cur node numData=0
2013-05-07 19:06:52.387 listTe[2542:11303] cur node numData=19
2013-05-07 19:06:52.388 listTe[2542:11303] cur node numData=18
2013-05-07 19:06:52.388 listTe[2542:11303] cur node numData=17
2013-05-07 19:06:52.388 listTe[2542:11303] cur node numData=16
2013-05-07 19:06:52.388 listTe[2542:11303] cur node numData=15
2013-05-07 19:06:52.389 listTe[2542:11303] cur node numData=4
2013-05-07 19:06:52.389 listTe[2542:11303] cur node numData=3
2013-05-07 19:06:52.389 listTe[2542:11303] cur node numData=2
2013-05-07 19:06:52.390 listTe[2542:11303] cur node numData=1
// 排序后
2013-05-07 19:06:52.390 listTe[2542:11303] cur node numData=0
2013-05-07 19:06:52.390 listTe[2542:11303] cur node numData=1
2013-05-07 19:06:52.390 listTe[2542:11303] cur node numData=2
2013-05-07 19:06:52.391 listTe[2542:11303] cur node numData=3
2013-05-07 19:06:52.391 listTe[2542:11303] cur node numData=4
2013-05-07 19:06:52.391 listTe[2542:11303] cur node numData=15
2013-05-07 19:06:52.391 listTe[2542:11303] cur node numData=16
2013-05-07 19:06:52.392 listTe[2542:11303] cur node numData=17
2013-05-07 19:06:52.392 listTe[2542:11303] cur node numData=18
2013-05-07 19:06:52.392 listTe[2542:11303] cur node numData=19
-(char *)convertToChar:(int)number
{
int weishu = 0;
int temp = number;
if (temp == 0) {
weishu = 1;
}
for (; temp%10 != 0; temp = temp/10) {
weishu++;
}
int cacul = number;
char *resultStr = (char *)malloc(weishu+1);
if (resultStr == nil) {
NSLog(@"error, check it");
return nil;
}
for (int i=weishu-1; i>=0; i--) {
resultStr[i]=cacul%10 +48;
cacul = cacul /10;
}
resultStr[weishu] ='\0';
NSLog(@"resultString=%s", resultStr);
return resultStr;
}
- (void)convertNumberToString:(id)sender {
[selfconvertToChar:892];
}
2013-05-07 18:23:32.329 listTe[2542:11303] resultString=892
strcpy的正确实现应为:
- char *my_strcpy(char *dst,const char *src)
- {
- assert(dst != NULL);
- assert(src != NULL);
- char *ret = dst;
- memcpy(dst,src,strlen(src)+1);
- return ret;
- }
- void * my_memcpy(void *dst,const void *src,unsigned int count)
- {
- assert(dst);
- assert(src);
- void * ret = dst;
- if (dst <= src || (char *)dst >= ((char *)src + count))//源地址和目的地址不重叠,低字节向高字节拷贝
- {
- while(count--)
- {
- *(char *)dst = *(char *)src;
- dst = (char *)dst + 1;
- src = (char *)src + 1;
- }
- }
- else //源地址和目的地址重叠,高字节向低字节拷贝
- {
- dst = (char *)dst + count - 1;
- src = (char *)src + count - 1;
- while(count--)
- {
- *(char *)dst = *(char *)src;
- dst = (char *)dst - 1;
- src = (char *)src - 1;
- }
- }
- return ret;
- }
杂项
strlen的实现很简单:
如下:
- int my_strlen(const char* p)
- {
- assert(p != NULL);
- int len =0;
- while (*p++)
- {
- len++;
- }
- return len;
- }
strcmp的实现:
- int my_cstrcmp(const char* p , const char* q)
- {
- assert(p != NULL && q != NULL);
- //循环找到第一个不相等的字符
- for (; *p == * q; ++p, ++q)
- {
- if (*p == 0)
- {
- return 0;
- }
- }
- return *(unsigned char*)p - *(unsigned char*)q >0 ? 1:-1;
- }
- strcpy函数实现:
- char* myStrcpy(char* des, const char* source)
- {
- assert(des != NULL && source != NULL);
- char* ret = des;
- while ( (*des++ = *source++) != '/0');
- return ret;
- }
itoa 函数实现:
- void itoaTest(int num,char str[] )
- {
- int sign = num,i = 0,j = 0;
- char temp[11];
- if(sign<0)//判断是否是一个负数
- {
- num = -num;
- };
- do
- {
- temp[i] = num%10+'0';
- num/=10;
- i++;
- }while(num>0);
- if(sign<0)
- {
- temp[i++] = '-';
- }
- temp[i] = '/0';
- i--;
- while(i>=0)
- {
- str[j] = temp[i];
- j++;
- i--;
- }
- str[j] = '/0';
- }
atoi函数实现:
- int atoiTest(char s[])
- {
- int i = 0,sum = 0,sign; //输入的数前面可能还有空格或制表符应加判断
- while(' '==s[i]||'/t'==s[i])
- {
- i++;
- }
- sign = ('-'==s[i])?-1:1;
- if('-'==s[i]||'+'==s[i])
- {
- i++;
- }
- while(s[i]!='/0')
- {
- if (s[i] >= 0 && s[i] <= '9')
- {
- sum = s[i]-'0'+sum*10;
- i++;
- }
- else
- {
- break;
- }
- }
- return sign*sum;
- }
反转字符串递归实现:
- char* reverse(char *str)
- {
- assert(str != NULL);
- int iLen = strlen(str);
- char c;
- int i;
- if (iLen<2)
- {
- return NULL;
- }
- else
- {
- //先把首尾交换
- c = str[0];
- str[0] = str[iLen-1];
- str[iLen-1] = c;
- //如果长度为2的话,返回null
- if (iLen == 2)
- {
- return NULL;
- }
- // 辅助空间,用来保存原字符串没有反转的部分
- char *str2 = (char*)malloc(iLen-1);
- memset(str2, '/0', iLen-1);
- //拷贝字符串
- for (i=0; i<iLen-2; i++)
- {
- str2[i] = str[i+1];
- }
- //反转中间字符串
- reverse(str2);
- //把反转后的字符串copy到原字符串
- for (i=0; i<iLen-2; i++)
- {
- str[i+1] = str2[i];
- }
- free(str2);
- str2 = NULL;
- }
- return str;
- }