顺序表:实现 q_addpro 任意位置插入,记录已知问题
1.c: - q_addpro 完成平移 + 插入的基本逻辑(从后往前挪,避免覆盖未搬元素) - 修掉 realloc 尺寸算错导致的堆越界(sizeof(q->max) → q->max * sizeof(int)) - 补上遗漏的写入动作 q->start[num] = x 仍存在的问题(详见 调试记录.md): - 平移循环多搬一次,把垃圾值带进表 - 没有检查插入位置是否合法,非法位置会静默越界写 - q->length 从未初始化,但 q_add 的扩容判断在用它 - q_reduce / q_reducepro 未完成 新增 调试记录.md 记录以上问题与待办测试用例。
This commit is contained in:
@@ -3,51 +3,27 @@
|
||||
#include <string.h>
|
||||
|
||||
typedef struct {
|
||||
int max; //列表最大长度
|
||||
int length; //列表现在的长度
|
||||
int *start; //内存地址起始位置
|
||||
int front; //列表起始索引
|
||||
int end; //列表结束索引
|
||||
int max; //列表最大长度
|
||||
int length; //列表现在的长度
|
||||
int *start; //内存地址起始位置
|
||||
int front; //列表起始索引
|
||||
int end; //列表结束索引
|
||||
|
||||
}queue;
|
||||
|
||||
|
||||
int main(){
|
||||
queue q;
|
||||
printf("输入整个列表长度");
|
||||
int length;
|
||||
scanf("%d",&length);
|
||||
int b;
|
||||
printf("接下来依次输入放进列表的东西");
|
||||
for (int i = 0; i < length; i++)
|
||||
{
|
||||
/* code */
|
||||
scanf("%d",&b);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int q_init(queue *q,int length){ //就是普通的初始化。要给他什么参数呢?首先就是queue的地址,然后是一个初始长度。然后初始化全0就行了。
|
||||
int q_init(queue *q,int length){ //就是普通的初始化。要给他什么参数呢?首先就是queue的地址,然后是一个初始长度。然后初始化全0就行了。
|
||||
q->start=malloc(length*sizeof(int));
|
||||
q->max=length;
|
||||
q->front=0;
|
||||
q->end=0;
|
||||
q->max=0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int q_add(queue *q,int num){ //最后边加上元素
|
||||
if(q->length==q->max){ //容量不够了的自动扩容
|
||||
int q_add(queue *q,int num){ //最后边加上元素
|
||||
if(q->length==q->max){ //容量不够了的自动扩容
|
||||
q->max+=5;
|
||||
q->start=realloc(q->start,q->max*sizeof(int));
|
||||
}
|
||||
@@ -56,17 +32,80 @@ q->end++;
|
||||
q->length++;
|
||||
}
|
||||
|
||||
int q_addpro(){ //任意地方加上元素,要进去一个索引编号和数值
|
||||
int q_addpro(queue *q,int num,int x){ //num是插入位置,x是插入的元素。任意地方加上元素,要进去一个索引编号和数值
|
||||
//先判断够不够位置加上去先
|
||||
if(q->end>=q->max){
|
||||
q->max=q->max+5;
|
||||
q->start=realloc(q->start,q->max*sizeof(int));//这里就是扩容代码,把max也一起增加了
|
||||
}
|
||||
//然后写平移的代码段,把加入的位置的东西到end的所有东西往后平移一个
|
||||
for (size_t i = q->end; i > num-1; i--)
|
||||
{
|
||||
/* code */
|
||||
q->start[i+1]=q->start[i];
|
||||
|
||||
|
||||
}
|
||||
q->end++;
|
||||
q->start[num]=x;
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
int q_reduce(){ //最前面拿走元素
|
||||
int q_reduce(){ //最前面拿走元素
|
||||
|
||||
|
||||
}
|
||||
|
||||
int q_reducepro(){ //任意地方拿走元素,也是索引号+数值
|
||||
int q_reducepro(queue *q,int num ,int *x){ //任意地方拿走元素,也是索引号+数值
|
||||
*x=q->start[num];
|
||||
for (size_t i = num; i < q->end+1; i++)
|
||||
{
|
||||
/* code */
|
||||
q->start[i]=q->start[i+1];
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int printall(queue *q){ //打印全部东西
|
||||
printf("下面是依次打印");
|
||||
for (size_t i = 0; i < q->end; i++)
|
||||
{
|
||||
/* code */
|
||||
|
||||
printf("\n%d\n",q->start[i]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int main(){
|
||||
queue q;
|
||||
printf("输入整个列表长度");
|
||||
int length;
|
||||
scanf("%d",&length);
|
||||
int b;
|
||||
q_init(&q,length);
|
||||
printf("接下来依次输入放进列表的东西");
|
||||
for (int i = 0; i < length; i++)
|
||||
{
|
||||
/* code */
|
||||
scanf("%d",&b);
|
||||
q_add(&q,b);
|
||||
}
|
||||
printall(&q);
|
||||
printf("\n接下来测试中间插入: 3号位置插入666,5号位置插入-77,11号位置插入1919810");
|
||||
q_addpro(&q,3,666);
|
||||
q_addpro(&q,5,-77);
|
||||
q_addpro(&q,11,1919810);
|
||||
printall(&q);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user