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]; } }