栈、队列、链表

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];
    }
    
}
相关文章
相关标签/搜索