1、實現 strcmp
int strcmp(const char *str1, const char *str2)
做是做對了,沒有抄搞,比較亂
int strcmp(const char *str1, const char *str2)
{
assert(str1 && srt2);
while (*str1 && *str2 && *str1 == *str2) {
str1++, str2++;
}
if (*str1 && *str2)
return (*str1-*str2);
elseif (*str1 && *str2==0)
return 1;
elseif (*str1 = = 0 && *str2)
return -1;
else
return 0;
}
int strcmp(const char *str1, const char *str2)
{
//省略判斷空指針(自己保證)
while(*str1 && *str1++ = = *str2++);
return *str1-*str2;
}
2、實現子串定位
int findsubstr(const char *mainstr, const char *substr)
做是做對了,沒有抄搞,比較亂
int mystrstr(const char* mainstr, const char* substr)
{
const char *p;
const char *q;
const char * u = mainstr;
//assert((mainstr!=null)&&( substr!=null));//用斷言對輸入進行判斷
while(*mainstr) //內部進行遞增
{
p = mainstr;
q = substr;
while(*q && *p && *p++ == *q++);
if(!*q )
{
return mainstr - u +1 ;//mainstr 指向當前起始位,u 指向
}
mainstr ++;
}
return -1;
}
3、已知一個單向鍊表的頭,請寫出刪除其某一個結點的算法,要求,先找到此結點,然後刪除。
slnodetype *delete(slnodetype *head,int key){}中 if(head->number==key)
{
head=pointer->next;
free(pointer);
break;
}
back = pointer;
pointer=pointer->next;
if(pointer->number==key)
{
back->next=pointer->next;
free(pointer);
break;
}
void delete(node* p)
{
if(head = node)
while(p)
}
4、有1,2,....一直到n的無序數組,求排序算法,並且要求時間複雜度為o(n),空間複雜度o(1),使用交換,而且一次只能交換兩個數.(華為)
#include<iostream.h>
int main()
{
int a[] = {10,6,9,5,2,8,4,7,1,3};
int len = sizeof(a) / sizeof(int);
int temp;
for(int i = 0; i < len; )
{
temp = a[a[i] - 1];
a[a[i] - 1] = a[i];
a[i] = temp;
if ( a[i] == i + 1)
i++;
}
for (int j = 0; j < len; j++)
cout<<a[j]<<",";
return 0;
}
5、寫出程式把一個鍊表中的接點順序倒排
typedef struct linknode
{
int data;
struct linknode *next;
}node;
//將一個鍊表逆置
node *reverse(node *head)
{
node *p,*q,*r;
p=head;
q=p->next;
while(q!=null)
{
r=q->next;
q->next=p;
p=q;
q=r;
}
head->next=null;
head=p;
return head;
}
6、寫出程式刪除鍊表中的所有接點
void del_all(node *head)
{
node *p;
while(head!=null)
{
p=head->next;
free(head);
head=p;
}
cout<<"釋放空間成功!"<<endl;
}
7、兩個字元串,s,t;把 t 字元串插入到 s 字元串中,s 字元串有足夠的空間存放 t 字元串
void insert(char *s, char *t, int i)
{
char *q = t;
char *p =s;
if(q == null)return;
while(*p!='\0')
{
p++;
}
while(*q!=0)
{
*p=*q;
p++;
q++;
}
*p = '\0';
}
8、寫一個函式,功能:完成記憶體之間的拷貝
memcpy source code:
void* memcpy( void *dst, const void *src, unsigned int len )
{
register char *d;
register char *s;
if (len == 0)
return dst;
if (is_overlap(dst, src, len, len))
complain3("memcpy", dst, src, len);
if ( dst > src ) {
d = (char *)dst + len - 1;
s = (char *)src + len - 1;
while ( len >= 4 ) {
*d-- = *s--;
*d-- = *s--;
*d-- = *s--;
*d-- = *s--;
len -= 4;
}
while ( len-- ) {
*d-- = *s--;
}
} else if ( dst < src ) {
d = (char *)dst;
s = (char *)src;
while ( len >= 4 ) {
*d++ = *s++;
*d++ = *s++;
*d++ = *s++;
*d++ = *s++;
len -= 4;
}
while ( len-- ) {
*d++ = *s++;
}
}
return dst;
}
9、公司考試這種題目主要考你編寫的代碼是否考慮到各種情況,是否安全(不會溢出)
各種情況包括:
1、參數是指針,檢查指針是否有效
2、檢查複製的源目標和目的地是否為同一個,若為同一個,則直接跳出
3、讀寫許可權檢查
4、安全檢查,是否會溢出
memcpy 拷貝一塊記憶體,記憶體的大小你告訴它
strcpy 是字元串拷貝,遇到'\0'結束
/* memcpy ─── 拷貝不重疊的記憶體塊 */
void memcpy(void* pvto, void* pvfrom, size_t size)
{
void* pbto = (byte*)pvto;
void* pbfrom = (byte*)pvfrom;
assert(pvto != null && pvfrom != null); //檢查輸入指針的有效性
assert(pbto>=pbfrom+size || pbfrom>=pbto+size);//檢查兩個指針指向的記憶體是否重疊
while(size-->0)
*pbto++ == *pbfrom++;
return(pvto);
}