棧、隊列、鏈表

1.隊列

title:一串數字,每次都把開頭的數刪除,第二個數放到隊尾巴,按這樣的刪除的數字順序是什麼

struct queue
{
    int data[100];//隊列的主體,用來存儲內容
    int head;//隊首
    int tail;//隊尾
};



int main(int argc, const char * argv[]) {

    
    struct queue q;
    int i;
    
    //初始化隊列
    q.head = 1;
    q.tail = 1;
    for (i = 1; i <= 9; i++) {
        scanf("%d",&q.data[q.tail]);
        q.tail++; //自增在後面,表示隊尾指在最後一個數的後一位
    }
    
    while (q.head < q.tail) {
        //首先隊首打印,即刪除的數字
        printf("%d ",q.data[q.head]);
        q.head++;
    
        //將新隊首的數添加到隊尾
        q.data[q.tail] = q.data[q.head];
        q.tail++;
        //再將隊首出隊
        q.head++;
    }
    
    
    return 0;
}

2.鏈表

假設目前咱們已經排序好了一串數字,但中途要插入一個數字,這樣的話,大於這個數字的數都要日後移一位了。算法

int main(int argc, const char * argv[]) {

    /*
     假設2個數組,1個爲數字的列表,另一個爲每個數字的右邊的數字的排序
     
     data    2 3 5 8 9 10 18 26 32
     right   2 3 4 5 6  7  8  9  0
     
 =>  data    2 3 5 8 9 10 18 26 32 6
     right   2 3 4 5 6  7  8  9  0 10
     
 =>  data    2 3 5  8 9 10 18 26 32 6
     right   2 3 10 5 6  7  8  9  0 4
     */
    
    
    
    int data[101],right[101];
    int i,n,t,len;
   
    printf("須要讀入多少個數字");
    scanf("%d",&n);
    for (i = 1; i <= n; i++) {
        scanf("%d",&data[i]);
    }
    len = n;
    
    //初始化數組right
    for (i = 1; i <=n; i++) {
        if (i!=n) {
            right[i] = i+1;
        }else{
            right[i] = 0;
        }
    }
    
    //直接再數組data的末位增長一個數
    printf("添加你須要插入的數字");
    len++;
    scanf("%d",&data[len]);
    
    //核心算法
    //從鏈表的頭部開始遍歷
    t =1;
    while (t != 0) {
        if (data[right[t]] > data[len]) {
            //right數組的位置調換
            right[len] = right[t];
            right[t] = len;
            break;
        }
        //由於位置調換了,本來的位置給放到len即最後處了
        t = right[t];
    }
    
    //輸出鏈表(right數組)中全部的數
    t = 1;
    while (t != 0) {
        printf("%d",data[t]);
        t = right[t];
    }
    
}
相關文章
相關標籤/搜索