一、线性表
1.在一个递增有序的顺序表中插入元素Y,得到的顺序表仍然有序。
该算法的思想主要分有三步:找到插入位置、插入、整个顺序表的长度加一。
//find方法是用来寻找所插入元素的合适位置
int find(Sqlist L,int Y){
for(int i=0;i<L.length;i++){
//如果Y<L.data[i]则证明已经找到合适位置,然后跳出循环
if(Y<L.data[i]){
break;
}
}
return i;
}
//insert方法用来插入元素Y
void insert(Sqlist &L,int Y){
int j,q;
q=find(L,Y);
for(j=L.length-1;j>=q;j--){
//插入Y后,之后的元素都要后移一位
L.data[j+1]=L.data[j];
//把顺序表的第q个位置赋值为Y
L.data[q]=Y;
//成功插入元素Y后,顺序表的长度加一
++(L.length);
}
2.线性表的删除操作
删除顺序表L中第i个元素,用变量e返回。若i的输入不合法则返回false;否则,将被删元素赋值给引用变量e,并将第i+1个元素及其后的所有元素依次向前移动一个位置,返回true。
bool ListDelete(Sqliist &L,int i,Elemtype &e){
//判断i值是否有效
if(i<1||i>L.length)
return false;
//把被删的元素赋值给e
e=L.data[i-1];
for(int j=i;j<L.length;j++)
//将第i个位置后的元素前移
L.data[j - 1] = L.data[j];
//由于删除了一个元素,故线性表的长度减一
L.length--;
return true;
}
3.单链表上的基本操作
①头插法建立单链表
//建立单链表
LinkList List_HeadInsert(LinkList &l){
LNode *s; int x;
//创建头结点
L=(LinkList)malloc(sizeof(LNode));
//初始为空链表
L->next==null;
//输入结点的值
scanf("%d",&x);
//当输入9999时表示程序结束
while(x!=9999){
//创建一个新的结点
s=(LNode*)malloc(sizeof(LNode));
//头插法中的关键代码!!!
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
②尾插法建立单链表
//建立单链表
LinkList List_HeadInsert(LinkList &l){
int x;
//创建头结点
L=(LinkList)malloc(sizeof(LNode));
//r为表尾指针
LNode *s,*r=L;
scanf("%d",&x);
while(x!=9999){
//创建一个新的结点
s=(LNode*)malloc(sizeof(LNode));
//尾插法中的关键代码!!!
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
//尾指针置为空
r->next=NULL;
return L;
}
4.删除顺序表中所有值为Y的数据元素。
算法思想是当顺序表中出现和Y值相等的数时,该数据元素需要向左移动k个位置,以便达到删除顺序表中所有值为Y的数据元素。
void delete(Sqlist &L,int Y){
//k用来表示顺序表中数据的移动位次
int k=0;
for(int i=0;i<L.length;i++)
if (L.data[i]!=Y){
//当顺序表中的数据和Y相等时,向左移动k个位置,从而把等于x的那个数据消掉
L.data[k]=L.data[i];
++k;
}
L.length=k;
}
5.把两个递增的有序表A、B合并成一个。
算法思想:建立一个空链表C,通过比较链表A和链表B中的数据元素的大小,逐个把较小的元素放入链表C中,这样就保证了链表C中的元素是链表A和链表B的集合且有序。
bool Demo(Sqlist A,Sqlist B,Sqist &C){
//判断链表C的长度是否合法
if(A.length+B.length>C.maxsize)
return false;
int i=j=k=0;
while(i<A.length&&j<B.length){
//当链表A中的数值小时,链表A中的数据放到链表C中
if(A.data[i]<B.data[j])
C.data[k++]=A.data[i++];
//否则,把链表B中的数据放到链表C中
else
C.data[k++]=A.data[j++];
}
while(i<A.length)
//把A中的所有元素放到C中
C.data[k++]=A.data[i++];
while(j<B.length)
//把B中的所有元素放到C中
C.data[k++]=B.data[j++];
return true;
}
非常感谢看完本篇的小伙伴们。本人现在是大四应届毕业生,刚刚经历过考研,希望能够把我认为重要的代码题分享给大家,让大家在复习备考期间能够少走一些弯路。同时经历过考研才让我知道自己原来有那么多的不足,希望借助这个平台来给大家分享一些考研经验,同时提升自己的学习能力。共勉,加油!
代码题会一直持续更新,希望和大家一起进步!!!