• C语言(数据结构,DEVFORGE学编程社区)


    1、行程编码压缩算法

     1 #include<stdio.h>
     2 #include <string.h>
     3 #define N 100
     4 
     5 int main()
     6 {    
     7     char s[N] = "", t[N] = "", ch;
     8     gets(s);
     9     
    10     int count = 0, index = 0;
    11     for(int i=0; s[i]; ++i)
    12     {    
    13         if(!count)
    14             ch = s[i];
    15         count++;
    16         if(ch!=s[i+1] || count==9){
    17             t[index++] = count+'0';
    18             t[index++] = ch;            
    19             count=0;            
    20         }
    21     }
    22     printf("%s",t); 
    23     return 0;
    24 }

    2、创建与遍历职工链表

     1 #include <stdio.h>
     2 #include <malloc.h>
     3 #include <string.h>
     4 #define N 100
     5 
     6 typedef struct node EMPLOYEE,*LIST;
     7 struct node{ 
     8     int num;
     9     LIST next;
    10 };
    11 
    12 void Insert(LIST head,int num)
    13 {    
    14     LIST p = head, s;
    15     s = (LIST)malloc( sizeof(EMPLOYEE) );
    16     s->num = num; //给p赋值
    17     
    18     while(p->next != NULL && s->num >= p->next->num)
    19         p = p->next;
    20     //连接 
    21     s->next = p->next; //若s最大, p->next=NULL
    22     p->next = s;  
    23 }
    24 
    25 LIST Create()
    26 {
    27     //创建头结点
    28     LIST head = (LIST)malloc(sizeof (EMPLOYEE));
    29     head->next = NULL;
    30     
    31     int n,num;
    32     scanf("%d",&n);
    33     //插入n个职工号
    34     while(n--)
    35     {
    36         scanf("%d",&num);
    37         Insert(head,num);
    38     }
    39     return head;
    40 }
    41 
    42 void Print(LIST head)
    43 {    
    44     LIST p = head;
    45     while(p->next != NULL)
    46     {
    47         p = p->next;
    48         printf("%d ",p->num);
    49     }   
    50 }
    51 
    52 int main()
    53 {    
    54     LIST head = Create();
    55     Print(head);    
    56     return 0;
    57 }

    3、毕业设计论文打印

     1 #include <stdio.h>
     2 #include <string.h>
     3 #define N 100
     4 
     5 int main()
     6 {    
     7     int arr[N] = {0}, n, index, count=0;
     8     scanf("%d%d",&n,&index);
     9     
    10     for(int i=0; i<n; ++i)
    11         scanf("%d",&arr[i]);
    12     
    13     for(int j=0; j<n; ++j){
    14         if(arr[j]>arr[index])
    15             count++;    
    16     }
    17     printf("%d",++count);
    18     return 0;
    19 }
     1 #include <stdio.h>
     2 #include <malloc.h>
     3 #include <string.h>
     4 #define N 100
     5 
     6 typedef struct QNode *Queue;
     7 typedef int Position,ElementType;
     8 struct QNode {
     9     ElementType *Data;     /* 存储元素的数组 */
    10     Position Front, Rear;  /* 队列的头、尾指针 */
    11     int MaxSize;           /* 队列最大容量 */
    12 };
    13 /* 循环链表队列 */
    14 Queue CreateQueue( int MaxSize )
    15 {
    16     /* 1.创建一个队列Q */
    17     Queue Q = (Queue)malloc(sizeof(struct QNode));
    18     /* 2.队列数据赋初值 */
    19     Q->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
    20     Q->Front = Q->Rear = 0;/* 队列指针 */
    21     Q->MaxSize = MaxSize;/* 队列最大容量 */
    22     /* 3.返回空队列 */
    23     return Q;
    24 }
    25 
    26 int main()
    27 {    
    28     int n, index, count=0;
    29     scanf("%d%d",&n,&index);
    30     /* 
    31     n个元素,最少需要n+1个空间
    32     Q->Front 指针占据一个空间
    33     Q->Front == Q->Rear 队列空
    34     Q->Front == (Q->Rear+1)%Q->MaxSize 队列满
    35     */
    36     Queue Q = CreateQueue(n+1);
    37     index++;/* 因为开始下标0给指针占了,所以index所在的位置+1 */
    38     
    39     for(int i=0; i<n; ++i){        
    40         Q->Rear = (Q->Rear+1)%Q->MaxSize;/* 尾指针后移 */
    41         scanf("%d",&Q->Data[Q->Rear]);/* 尾指针指向的位置输入元素 */
    42     }
    43     
    44     for(int j=0; j<n; ++j)//遍历
    45     {    
    46         if(Q->Data[(Q->Front+1)%Q->MaxSize]<=Q->Data[index])
    47         {
    48             Q->Rear = (Q->Rear+1)%Q->MaxSize;            
    49             Q->Data[Q->Rear] = Q->Data[(Q->Front+1)%Q->MaxSize]; //入队尾
    50             if(Q->Data[index]==Q->Data[(Q->Front+1)%Q->MaxSize]){
    51                 index = Q->Rear;/*指定的打印位置到了队尾*/
    52             }        
    53         }
    54         else{
    55             count++; /*指定的打印元素优先级高的++*/
    56         }    
    57         Q->Front =(Q->Front+1)%Q->MaxSize;//出队
    58     }
    59     
    60     printf("%d", ++count);//本身打印1小时
    61     return 0;
    62 }

    4、火车站

     1 #include <stdio.h>
     2 #include <stdbool.h>
     3 #include <malloc.h>
     4 #define ERROR -1
     5 #define N 100
     6 
     7 typedef int ElementType;
     8 typedef int Position;
     9 struct SNode {
    10     ElementType *Data; /* 存储元素的数组 */
    11     Position Top;      /* 栈顶指针 */
    12     int MaxSize;       /* 堆栈最大容量 */
    13 };
    14 typedef struct SNode *Stack;/* 栈指针 */
    15 
    16  /* 创建空栈 */
    17 Stack CreateStack( int MaxSize )
    18 {
    19     Stack S = (Stack)malloc(sizeof(struct SNode));
    20     S->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
    21     S->Top = -1;
    22     S->MaxSize = MaxSize;
    23     return S;
    24 }
    25 
    26 /* 栈满 */
    27 bool IsFull( Stack S )
    28 {
    29     return (S->Top == S->MaxSize-1);
    30 }
    31 
    32  /* 入栈 */
    33 bool Push( Stack S, ElementType X )
    34 {
    35     if ( IsFull(S) ) {
    36         //printf("堆栈满");
    37         return false;
    38     }
    39     else {
    40         S->Data[++(S->Top)] = X;
    41         return true;
    42     }
    43 }
    44 
    45  /* 栈空 */
    46 bool IsEmpty( Stack S )
    47 {
    48     return (S->Top == -1);
    49 }
    50 
    51  /* 出栈 */
    52 ElementType Pop( Stack S )
    53 {
    54     if ( IsEmpty(S) ) {
    55         //printf("堆栈空");
    56         return ERROR; /* ERROR是ElementType的特殊值,标志错误 */
    57     }
    58     else 
    59         return ( S->Data[(S->Top)--] );
    60 }
    61 
    62 int main()
    63 {   
    64     int n,a;
    65     int arr[N] = {0}, i, index=0;
    66     /* 1.A方向驶来的火车车厢n节 */
    67     scanf("%d",&n);
    68     /* 2.车站至少可以停放n节车厢(任意多) */
    69     Stack s = CreateStack(n);
    70     /* 3.出站顺序( 数组arr存放 ) */
    71     while(scanf("%d",&a) && a)
    72         arr[index++] = a;
    73     /* 4.A方向驶来的火车车厢顺序从1开始(in=1) */
    74     int in = 1;
    75     /* 5.依次出站 */
    76     for(i=0; i<index; ++i)
    77     {   /*如果出站顺序号与车站车厢顺序号不一致
    78         且A方向还有车厢,依次进站*/
    79         while(arr[i]!=s->Data[s->Top] && in<=n && Push(s,in))    
    80             in++;
    81         /* A方向没有车厢 
    82         且出站顺序号与车站车厢顺序号不一致
    83         编排顺序不可能, 输出No, 退出*/
    84         if(in>n && arr[i]!=s->Data[s->Top]) 
    85         {
    86             printf("No"); 
    87             break;
    88         }
    89         /* 车站有车厢, 出站 */
    90         if(!IsEmpty(s)) 
    91             Pop(s);
    92     }
    93     /* 6.上面的循环非break中断, 编排顺序正确, 输出Yes */
    94     if(i==index) 
    95         printf("Yes");    
    96     return 0;
    97 }

    5、大数减法

     1 #include<stdio.h>  
     2 #include<string.h>  
     3 int x[100]={0},y[100]={0},z[105]={0};//将数组元素全部初始化为0  
     4 void sub(int x[],int y[],int len)  
     5 {  
     6     int i,j;  
     7     for(i=0;i<len;i++)  
     8     {  
     9         if(x[i]>=y[i])//如果x[i]>=y[i],不用向前一位借1,可直接减   
    10             z[i]=x[i]-y[i];  
    11         else  //如果x[i]<y[i],向前一位借1,同时前一位应减1   
    12         {  
    13             z[i]=x[i]+10-y[i];  
    14             x[i+1]=x[i+1]-1;  
    15         }      
    16     }  
    17     for(i=len-1;i>0;i--)//删除前缀0   
    18     {  
    19         if(z[i]==0)  
    20             len--;  
    21         else  
    22             break;   
    23     }  
    24     for(i=len-1;i>=0;i--)  //倒序输出数组   
    25         printf("%d",z[i]);  
    26     printf("
    ");  
    27 }  
    28 int main()  
    29 {  
    30     char a[100],b[100];//通过字符串对大数进行输入并储存   
    31     int len1,len2;  
    32     scanf("%s %s",a,b); 
    33      
    34     int i,j=0,k=0;  
    35     len1=strlen(a);  
    36     len2=strlen(b);  
    37     /*将两个字符串中的字符转化为数字,并倒序储存到数组中,
    38     即字符串为123456,则数组为654321*/   
    39     for(i=len1-1,j=0;i>=0;i--)
    40         x[j++]=a[i]-'0';  
    41     for(i=len2-1,k=0;i>=0;i--)  
    42         y[k++]=b[i]-'0';  
    43     //若减数长度 > 被减数,正常减 
    44     if(len1>len2)    
    45         sub(x,y,len1);  
    46     else if(len1<len2) //若减数长度 < 被减数,被减数 减 减数  
    47     {  
    48         printf("-");  
    49         sub(y,x,len2);  
    50     }   
    51     else  //若减数长度 == 被减数,判断两个数的大小   
    52     {  
    53         for(i=len1-1;i>=0;i--)//判断每一位两个数的大小  
    54         {  
    55             if(x[i]==y[i])  
    56                 continue;  
    57             if(x[i]>y[i])//即减数大   
    58             {  
    59                 sub(x,y,len1);  
    60                 break;  
    61             }      
    62             if(x[i]<y[i])//即被减数大   
    63             {  
    64                 printf("-");  
    65                 sub(y,x,len1);  
    66                 break;   
    67             }      
    68         }  
    69     }        
    70     return 0;   
    71 }

    6、精确乘幂

     1 #include <stdio.h>
     2 #include <string.h>
     3 #define N 200
     4 int main()
     5 {    
     6     char numStr[10];/* 定义数字字符串 */
     7     /* 定义字符串长度幂int数组及下标int数字小数点后位数 */
     8     int i,j,len,n,numArray[N],index,numInt,digit;
     9     memset(numArray, 0, sizeof(numArray));
    10     numInt = index = digit = 0;
    11     
    12     /* 1.输入数字字符串幂次 */
    13     scanf("%s %d",numStr,&n);    
    14     len = strlen(numStr);
    15     
    16     int flag = 1, zero = 0;//判断最后的无效'0',定义标记
    17     /* 2.字符串倒序转int数组num */
    18     for(i = len-1;i >= 0;i--)
    19     {  
    20         if(numStr[i] == '0' && flag)
    21         {
    22             zero++;//无效的'0'
    23             continue;
    24         }
    25         else
    26         {
    27             flag = 0;
    28             if(numStr[i] == '.')
    29             {                
    30                 digit = len-zero-i-1;//有效的小数点后位数
    31                 continue;//去掉小数点
    32             }
    33         }
    34         numArray[index++] = numStr[i] - '0';
    35     }
    36 
    37     /* 3.int数组转int */
    38     for(i = index-1;i >= 0;i--)
    39         numInt = numInt*10 + numArray[i];
    40     
    41     /* 4.求幂 */
    42     for(i = 1; i < n; i++)//幂次(本身一次)
    43     {
    44         int carry = 0;    
    45         for(j = 0; j < N; j++)//int数字与int数组数字相乘
    46         {
    47             int tmp = numInt*numArray[j] + carry;
    48             numArray[j] = tmp%10;
    49             carry = tmp/10;
    50         }
    51     }
    52     
    53     /* 5.去掉数组中无效的'0'(小数位控制) */
    54     for(i = N-1; numArray[i]==0 && i>n*digit; i--); 
    55     
    56     /* 6.打印结果 */
    57     for(j = i; j >= 0; j--)
    58     {
    59         if(j == n*digit-1)//小数位之前打印小数点, 无小数位-1
    60             printf(".");
    61         printf("%d",numArray[j]);
    62     }
    63     return 0;
    64 }
      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 char *strrev(char* p)  
      5 {  
      6     char *p1=p;      
      7     char *p2=p;  
      8     char ch;  
      9     while(*p1++);  
     10     p1--;    
     11     p1--;    
     12    
     13     while(p2 < p1)  
     14     {  
     15         ch = *p2;  
     16         *p2++ = *p1;   
     17         *p1-- = ch;   
     18     }  
     19   
     20     return(p);  
     21 }  
     22 
     23 //change the string to the big-int and save them in array
     24 //返回值:小数点的位数
     25 //src: the String
     26 //number: the array
     27 //length: string's length
     28 int string2int(char * src, int * number, int length);
     29 
     30 int string2int(char * src, int * number, int length)
     31 {
     32     int flag=0;
     33     //define the buffer to store the data
     34     char * str = (char *)malloc(sizeof(char)*(length+1));
     35     memset(str, '', length+1);
     36     memcpy(str, src, length);
     37     /*  puts(str);*/
     38     strrev(str);
     39     /*  puts(str);*/
     40     //transfer string to int
     41     //int temp = *number; //原有的数据不为零时,也需要考虑
     42     int i, j;
     43     for (i=0, j=0; i<length; i++)
     44     {
     45         //temp *= 10;
     46         //原有数据为字符'A',顾需要减去'0'
     47         if (str[i]!='.')
     48         {
     49             number[j++] += (int)(str[i] - '0');
     50         }
     51         else
     52         {
     53             flag = j;
     54         }
     55 
     56     }
     57     //return the transfer number
     58     //*number = temp;
     59     //clear the dynamic memory
     60     free(str);
     61     str = NULL;
     62     return flag;
     63 }
     64 
     65 //大数相乘
     66 //乘数:numsA,numsB
     67 //长度:lenA, lenB
     68 int BigNumberMultiplication(int * numsA, int lenA, int * numsB, int lenB, int *
     69                             results);
     70 int BigNumberMultiplication(int * numsA, int lenA, int * numsB, int lenB, int * results)
     71 {
     72     int i, j;
     73     //multi procedure
     74     for (i=0; i<lenB; i++)
     75     {
     76         for (j=0; j<lenA; j++)
     77         {
     78             //the i,j place number multi, and the result is on the i+j place
     79             results[i+j] += numsA[j] * numsB[i];
     80         }
     81     }
     82     //process the result
     83     for (i=0; (i<lenA+lenB); i++)
     84     {
     85         if (results[i]>=10)  //the low place to the high place, if the low number is >=10       
     86         {
     87             results[i+1] += results[i] /10;
     88             results[i] %= 10;
     89         }
     90     }
     91     //calcute lenA
     92     for (i=lenA+lenB-1; i>=0; i--)
     93     {
     94         if (results[i] != 0)
     95         {
     96             break;
     97         }
     98     }
     99     return i+1;
    100 }
    101 
    102 int main()
    103 {
    104     char str[7] = {''};
    105     int numsB[5] = {0};
    106     int n;
    107     scanf("%s %d", str, &n);
    108     int length = strlen(str);
    109     //获取小数点的位数
    110     int PointPlace = string2int(str, numsB, length);
    111     if (PointPlace!=0) // reduce the . nums
    112     {
    113         length--;
    114     }
    115 
    116     int * pNumsA = (int *)malloc(length*n*sizeof(int));
    117     int * pResults = (int *)malloc(length*n*sizeof(int));
    118     memset(pNumsA, 0, length*n*sizeof(int));
    119     memset(pResults, 0, length*n*sizeof(int));
    120     memcpy(pNumsA, numsB, length*sizeof(int));
    121     // int i;
    122     // for (i=0; i<length; i++)
    123     // {
    124     //      printf("%d", pNumsA[i]);
    125     // }
    126     // printf("-%d
    ", PointPlace);
    127     int lenA = length;
    128     /*printf("%d", lenA);*/
    129     int i, j;
    130     int bIsBegin = 0;
    131     char * pString = (char *)malloc(sizeof(char)*length*n+2);
    132     memset(pString, '', sizeof(char)*length*n+2);
    133     if (n==1)
    134     {
    135         printf("%s", str);
    136     }
    137     else
    138     {
    139         //求幂
    140         for (i=1; i<n; i++)
    141         {
    142             lenA = BigNumberMultiplication(pNumsA, lenA, numsB, length,
    143                                            pResults);
    144             memcpy(pNumsA, pResults, lenA*sizeof(int));
    145             memset(pResults, 0, lenA*sizeof(int));
    146             //printf("LenA---%d
    ", lenA);
    147         }
    148 
    149         //将结果由数组转化为字符串并添加小数点
    150         i=0;
    151         j = 0;
    152         while (i<length*n)
    153         {
    154             if (pNumsA[i]==0)
    155             {
    156                 if (1==bIsBegin)
    157                 {
    158                     if ( i==(PointPlace*n) )
    159                     {
    160                         if (i!=0)
    161                             pString[j++] = '.';
    162                     }
    163                     pString[j++] = pNumsA[i++] + '0';
    164                 }
    165                 else
    166                     i++;
    167 
    168             }
    169             else
    170             {
    171                 bIsBegin = 1; ////begin from the first non-zero value
    172 
    173                 if ( i==(PointPlace*n) )
    174                 {
    175                     if (i!=0)
    176                     {
    177                         pString[j++] = '.';
    178                     }
    179 
    180                 }
    181 
    182                 pString[j++] = pNumsA[i++] + '0';
    183             }
    184         }
    185 
    186         free(pNumsA);
    187         free(pResults);
    188         //反转字符串:之前的字符串一直是倒叙的
    189         strrev(pString);
    190 
    191         //输出结果:主要是处理小数点前0的个数
    192         if (PointPlace==0)
    193         {
    194             for (i=0; i<length*n; i++)
    195             {
    196                 if (pString[i]!='0')
    197                     break;
    198             }
    199             printf("%s", &pString[i]);
    200         }
    201         else
    202         {
    203             for (i=0; i<length*n; i++)
    204             {
    205                 if (pString[i]!='0')
    206                 {
    207                     if (pString[i]=='.')
    208                     {
    209                         i--;
    210                         break;
    211                     }
    212                     else
    213                     {
    214                         break;
    215                     }
    216 
    217                 }
    218 
    219             }
    220             printf("%s", &pString[i]);
    221         }
    222     }
    223 
    224     free(pString);
    225 
    226     return 0;
    227 }

    7、大数除法

      1 #include<stdio.h>
      2 #include<string.h>
      3  
      4 char a[100],b[100];//用两个字符串用来输入两个大数
      5  
      6 int x[100],y[100],z[100],m[100];//被除数  除数  商  余数
      7  
      8 int digit;  //大数的位数
      9  
     10 void sub(int x[],int y[],int len1,int len2)//大数减法
     11 {
     12     int i;
     13     for(i=0;i<len1;i++)
     14     {
     15         if(x[i]<y[i])
     16         {
     17             x[i]=x[i]+10-y[i];
     18             x[i+1]--;
     19         }
     20         else
     21             x[i]=x[i]-y[i];
     22     }
     23     for(i=len1-1;i>=0;i--)//判断减法结束之后,被除数的位数
     24     {
     25         if(x[i])
     26         {
     27             digit=i+1;
     28             break;
     29         }
     30     }
     31 }
     32 int judge(int x[],int y[],int len1,int len2)
     33 {
     34     int i;
     35     if(len1<len2)
     36         return -1;
     37     if(len1==len2)//若两个数位数相等
     38     {
     39         for(i=len1-1;i>=0;i--)
     40         {
     41             if(x[i]==y[i])//对应位的数相等
     42                 continue;
     43             if(x[i]>y[i])//被除数 大于 除数,返回值为1
     44                 return 1;
     45             if(x[i]<y[i])//被除数 小于 除数,返回值为-1
     46                 return -1;
     47         }
     48         return 0;//被除数 等于 除数,返回值为0
     49     }
     50 }
     51 int main()
     52 {
     53     int i,j=0,k=0,temp;
     54     int len1,len2,len;//len两个大数位数的差值
     55  
     56     scanf("%s %s",a,b);
     57     //while(~scanf("%s %s",a,b))
     58     {
     59         len1=strlen(a);//被除数位数
     60         len2=strlen(b);//除数位数
     61  
     62         for(i=len1-1,j=0;i>=0;i--)//将字符串中各个元素倒序储存在数组中
     63         {
     64             x[j++]=a[i]-'0';
     65         }
     66         for(i=len2-1,k=0;i>=0;i--)
     67         {
     68             y[k++]=b[i]-'0';
     69         }
     70  
     71         if(len1<len2)//当被除数位数 小于 除数位数时
     72         {
     73             printf("商是:0
    ");
     74             printf("余数是:");
     75             puts(a);
     76         }
     77         else //当被除数位数 大于或者等于 除数位数时
     78         {
     79             len=len1-len2;//两个大数位数的差值
     80             for(i=len1-1;i>=0;i--)//将除数后补零,使得两个大数位数相同。
     81             {
     82  
     83                 if(i>=len)
     84                     y[i]=y[i-len];
     85                 else
     86                     y[i]=0;
     87                 
     88             }
     89             len2=len1;//将两个大数数位相同
     90  
     91             digit=len1; //将原被除数位数赋值给digit
     92  
     93             for(j=0;j<=len;j++)
     94             {
     95                 z[len-j]=0;
     96  
     97                 while(((temp=judge(x,y,len1,len2))>=0)&&digit>=k)//判断两个数的大小以及被除数位数与除数原位数的关系
     98                 {
     99                     sub(x,y,len1,len2); //大数减法函数
    100  
    101                     z[len-j]++;//储存商的每一位
    102  
    103                     len1=digit;//重新修改被除数的长度
    104  
    105                     if(len1<len2&&y[len2-1]==0)
    106                         len2=len1;  //将len1长度赋给len2;
    107                 }
    108  
    109                 if(temp<0)//若被除数 小于 除数,除数减小一位。
    110                 {
    111                     for(i=1;i<len2;i++)
    112                         y[i-1]=y[i];
    113                     y[i-1]=0;
    114                     if(len1<len2)
    115                         len2--;
    116                 }
    117             }
    118  
    119             //printf("商是:");
    120             for(i=len;i>0;i--)//去掉前缀0
    121             {
    122                 if(z[i])
    123                     break;
    124             }
    125             for(;i>=0;i--)
    126                 printf("%d",z[i]);
    127             printf("
    ");
    128  
    129             /* printf("余数是:");
    130             for(i=len1;i>0;i--)
    131             {
    132                 if(x[i])
    133                     break;
    134             }
    135             for(;i>=0;i--)
    136                 printf("%d",x[i]);
    137             printf("
    "); */
    138         }
    139     }
    140     return 0;
    141 }

    8、插入链表结点

     1 #include <stdio.h> 
     2 #include <stdlib.h>
     3 #include <string.h>
     4 /* node */
     5 typedef struct staff *STAFF;
     6 struct staff
     7 {
     8     char  num[6];      //职工工号
     9     STAFF next;
    10 };
    11 /* makenode */
    12 STAFF makenode()
    13 {
    14     STAFF p = (STAFF)malloc(sizeof(struct staff));
    15     scanf("%s",p->num);
    16     p->next = NULL;
    17     return p;
    18 }
    19 /* create */
    20 STAFF create(int m) 
    21 {
    22     STAFF head,p;
    23     head = p = makenode();
    24     while(--m)
    25     {        
    26         p->next = makenode();//尾插    
    27         p = p->next;    
    28     }
    29     return head;
    30 }
    31 /* print */
    32 void list(STAFF p)
    33 {
    34     while(p){
    35         printf("%s ",p->num);
    36         p= p->next;
    37     }    
    38     printf("
    ");
    39 }
    40 /* insert */
    41 STAFF insert(STAFF head,STAFF s)
    42 {
    43     STAFF p = head;    
    44     while(p->next!=NULL&&strcmp(p->next->num,s->num)<0){
    45         p=p->next;
    46     } 
    47     s->next=p->next;
    48     p->next=s;      
    49     return head;
    50 }
    51 int main()
    52 {
    53     int n;
    54     char num[6];
    55     scanf("%d",&n);
    56     STAFF head = create(n);
    57     STAFF s = makenode();
    58     head = insert(head,s);   
    59     list(head); //打印链表
    60     return 0;
    61 }

    9、大数乘法

     1 #include <stdio.h>
     2 #include <string.h>
     3 #define MAX 300
     4 
     5 unsigned an1[MAX+5] = {0};
     6 unsigned an2[MAX+5] = {0};
     7 unsigned a[2*MAX+10] = {0};
     8 char aa[MAX+10] = "";
     9 char b[MAX+10] = "";
    10 int main()
    11 {
    12     gets(aa);//读入一个字符串 
    13     gets(b);
    14     int i,j;
    15     int len_a = strlen(aa);
    16     for(j=0,i=len_a-1;i>=0;i--)
    17         an1[j++]=aa[i]-'0';//转换为10进制数字     
    18     int len_b=strlen(b);    
    19     for(j=0,i=len_b-1;i>=0;i--)
    20         an2[j++]=b[i]-'0';
    21     
    22     for(i=0;i<len_b;i++){//这一步可以进行优化 但是很复杂 O(logn(1.59)) 
    23         for(j=0;j<len_a;j++)
    24             a[i+j]+=an2[i]*an1[j];//每一位都进行相加 m*n的复杂度 
    25     }    
    26     for(i=0;i<2*MAX;i++){
    27         if(a[i]>=10){
    28             a[i+1]+=a[i]/10;//由于进位还没有考虑进去 这样就有些数字大于10的 
    29             a[i]%=10;//我们要进位 
    30         }
    31     }
    32     bool b=false;
    33     for(i=MAX*2;i>=0;i--)//下面就是输出了 一定要注意个位数字的下表更大 所以是从第一个非0数字开始的 
    34         if(b)    
    35             printf("%d",a[i]);
    36         else if(a[i]){
    37             printf("%d",a[i]);
    38             b=true;
    39         }
    40     if(!b)//这一步太重要了 一定不要忘记 如果有一个数字是0的话 这个我就忘记了 一直wrong answer 几乎快崩溃了 
    41         printf("0");
    42     return 0;
    43 }

    10、Symmetric Sort

     1 #include<stdio.h>  
     2 #include<string.h>  
     3 #include<algorithm>  
     4 using namespace std;  
     5 struct ch{  
     6     int len; 
     7     char str[30];  
     8 }s[1000];  
     9 bool cmp(struct ch a,struct ch b){  
    10     return a.len<b.len;  
    11 }  
    12 int main()
    13 {  
    14     int i,j,n;  
    15     scanf("%d",&n); 
    16     for(i=0;i<n;i++){  
    17         scanf("%s",s[i].str);//这里s[i]前边加不加&符号都行   
    18         s[i].len=strlen(s[i].str);  
    19     }  
    20     /* 这里还有一个stable_sort,用法和sort是一样的,
    21     区别是stable_sort是稳定排序,对于相等的值次序不变   */
    22     sort(s,s+n,cmp); 
    23     for(i=0;i<n;i+=2)  
    24          printf("%s ",s[i].str);  
    25     if(i==n+1) j=n-2;//因为i变到n+1的时候,可以自己调试一下   
    26     else j=n-1;  
    27     for(;j>=0;j-=2)  
    28         printf("%s ",s[j].str);  
    29     printf("
    ");
    30     return 0;  
    31 }
  • 相关阅读:
    Centos7安装Docker
    [LeetCode] 651. 四键键盘 ☆☆☆(动态规划)
    一行代码就能解决的算法题
    博弈问题--石头游戏(动态规划)
    [LeetCode] 322. 零钱兑换 ☆☆☆(动态规划)
    java趣题
    [LeetCode] 516. 最长回文子序列 ☆☆☆(动态规划)
    [LeetCode] 337. 打家劫舍III ☆☆☆(动态规划)
    算法基础--贪心算法
    [LeetCode] 42. 接雨水 ☆☆☆☆☆(按列、动态规划、双指针)
  • 原文地址:https://www.cnblogs.com/GoldenEllipsis/p/11649287.html
Copyright © 2020-2023  润新知