1. 程式人生 > 其它 >指標與連結串列

指標與連結串列

技術標籤:訓練報告

1.應用指標實現順序後移
(譚浩強,《C程式設計(第四版)》,清華大學出版社:第八章,P291,第4題)
有n個整數,使前面各數順序向後移m個位置,最後m個數變成最前面m個數,見下圖所示,輸入n個整數和輸出調整後的n個整數。
在這裡插入圖片描述
設計實現函式void f(int *a,int n,int m),函式的功能為將整型陣列a儲存的n個數依次後移m個位置,最後m個數變成最前面m個數。
裁判測試程式樣例:

#include <stdio.h>
#include <string.h>
#define N 20

/* 請在這裡填寫答案 */

int main(
void){ int i,n,m; int a[N]; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); scanf("%d",&m); f(a,n,m); for(i=0;i<n;i++) printf("%5d",a[i]); return 0; }

輸入格式:
第一行輸入整數個數n(n<20)。 第二行輸入n個整數,資料間以空格為間隔。 第三行輸入後移量m。

輸出格式:
輸出從大到小排序後的5個字串,一行一個。

輸入樣例:
6
1 2 3 4 5 6
3

輸出樣例:
4 5 6 1 2 3

//主要的思路是利用指標將指標代表的陣列中的資料調換位置
//一次一次遍歷
//由於在函式中可以利用函式遞迴 

void  f(int *a,int n,int m){
	int* p;
	int be;
	be=*(a+n-1);
	for(p=a+n-1;p>a;p--){
		*p=*(p-1);	
	}//目的:遍歷除了最後一位其他的都向右邊移動一位 (數值) 
	*p=be;//目的:最後一位挪動到第一位回來(數值) 
	m--;
	if(m) f(a,n,m)
;//利用遞迴(這道題我覺得用迴圈也是可以的) return ; }

2.應用字串指標實現字串排序功能
程式輸入5個字串(字元數小於N=20),實現從大到小排序後輸出排序後的各字串。
設計實現函式void f(char (*c)[N],int n),函式的功能為將字串陣列c從大到小排序。
裁判測試程式樣例:

#include <stdio.h>
#include <string.h>
#define N 20

/* 請在這裡填寫答案 */

int main(void){
    int i;
    char c[5][N];
    for(i=0;i<5;i++)
        gets(c[i]);
    f(c,5);
    for(i=0;i<5;i++)
        puts(c[i]);
    return 0;
}

輸入格式:
輸入5個字串(字元數小於N=20),一行一個。

輸出格式:
輸出從大到小排序後的5個字串,一行一個。

輸入樣例:
123
234
124
243
521
輸出樣例:
521
243
234
124
123

strcpy函式,即string copy(字串複製)的縮寫。strcpy是一種C語言的標準庫函式,strcpy把含有’\0’結束符的字串複製到另一個地址空間,返回值的型別為char*。

//本題我的問題在於不知道二維陣列內容如何換序                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    oid f(char (*c)[N],int n){
	int i,j,k;
     for(i=0;i<4;i++){
        k=i;
        for(j=i+1;j<5;j++){
            if(strcmp(c[k],c[j])<0)
                k=j;   
		}
        if(k!=i){
            char temp[100];
            strcpy(temp, c[k]);
            strcpy(c[k], c[i]);
            strcpy(c[i], temp);
            //到這裡就類似於去一箇中間變數
			//temp=a;a=b;b=temp;這個意思 
        }
	}
	return; 
}