算法题
1.试写一个插入算法int insertPost_seq(palist ,p,x), 在palist 所指的顺序表中,下标为p的元素之后,插入一个值为x的元素,返回插入成功与否的标志。
int insertPost_seq(PSeqList palist, int p, DataType x) {
//在下标为p的元素之后插入元素x;
int i;
if (palist->n >= palist->MAXNUM) {
printf("Overflow!\n");
return 0;
}
if (p<0 || p>palist->n) // if (p<-1 || p>=palist->n)
{
printf("Not exist!\n");
return 0;
}
for (i = palist->n - 1; i >= p+1; i--)
{
palist->element[i + 1] = palist->element[i];
palist->element[p + 1] = x;
palist->n = palist->n + 1;
return 1;
}
2.试写一个删除算法
deleteV_seq(palist,x),在palist所指的顺序表中中,删除一个值为x的元素,返回删除成功与否。
int sreach(PSeqList palist,int x)
{
int q;
for (q = 0; q < palist->n; q++)
{
if (palist->element[q] == x)
return q;
}
return -1;
}
int deleteP_seq(PSeqList palist, int p) //删除元素
{
int i;
if (p<0 || p>(palist->n) - 1)
{
printf("Not exit!\n");
return 0;
}
for (i = p; i < palist->n - 1; i++)
palist->element[i] = palist->element[i + 1];
palist->n = palist->n - 1;
return 1;
}
3.设有一线性表eee=(e1e_1e1,e2e_2e2,…,en−1e_{n-1}en−1,ene_nen) ,其逆线性表定义为e′e'e′=(ene_nen,en−1e_{n-1}en−1,…,e2e_2e2,e1e_1e1) 。请设计一个算法。将用顺序表表示的线性表逆置,要求逆线性表仍占用原线性表的空间。
顺序表
void reversal(PSeqList palist)
{
Datatype tmp;
int i;
if(palist->n==0||palist->n==1)
return 0;
for(i=0;i<palist->n/2;i++) //这里palist->n/2 相当于(palist->n)/2
{
element[i]=tmp;
tmp=element[palist->n-i-1];
element[palist->n-i-1]= element[i];
}
}
单链表(不带头结点)
void reversal(LinkList llist){
PNode p,q,r;
p=(llist);
If(p==NULL) return ;
q=p->link;
if(q==NULL) return;
r=q->link;
while(r!=NULL){
q->link=p;
p=q;
q=r;
r=r->link;
}
q->link=p;
(llist)->link==NULL;
llist=q;
}
int searchmin(PSeqList palist) {
//寻找最小的元素;
int min;
int i;
min = palist->element[0];
for (i = 1; i < palist->n - 1; i++)
{
if (palist->element[i] < min)
{
min = palist->element[i];
}
}
return min;
}
这个算法是算法复杂度最小的,但是题目好像没有要求 我感觉可以直接用很多次delete 函数吧 哈哈
6.先找到p的前驱结点
PNode locatePre_link(LinkList llist ,PNode p){
PNode p1;
if(llist==NULL) return NULL;
p1=llist;
while(p1!=NULL&&p1->link!=p)
p1=p1->link;
return p1;
}
int insertPost_link(LinkList llist ,PNode p, DataType x){
PNode q=(PNode)malloc(sizeof(struct Node));
if(q==NULL) {printf("Out of space!!! \n"); return 0;}
else{q->info=x; q->link=p->link;p=>link=q; return 1;}
}
然后用 insertPost_link(llist,p1,x)
7.额 和上面那个一样 先找到前驱结点p1,然后在delete p1
p1->link=p->link;
int deletei_link(LinkList palist, int num)
/*返回0失败,返回1成功*/
{
if (palist == NULL || num < 0) return 0; //第一种情况
PNode p, pre = NULL;
if (num == 0) //第二种情况
{
p = palist;
palist = p->link;
free(p);
return 1;
}
p = palist;
//第三种情况
int count = 1;
while (count !=num && p->link != NULL)
{
pre = p;
p = p->link;
count++;
}
if (pre == NULL) return 0;
pre->link = p->link;
free(p);
return 1;
}
9.这个和上面的一样 就是要在删除操作的时候 加个k次循环
12.
LinkList delete_same(LinkList llist) {
PNode p,q;
LinkList r;
if (llist==NULL) return(NULL);
p = llist;
while(p ->next!=NULL)
{
q=p ->next ;
while(q->next!=NULL))
if(p ->next ->info== q ->next ->info )
{ r = q ->next;
q ->next= r ->next;
free(r);
} //多加个r才能让p继续走下去 /(ㄒoㄒ)/~~
else { q = q ->next;}
p = p ->next;
}
return 1;
}
int num(LinkList llist)
{
int num;
PNode q;
if (llist ==NULL) return ;
q=llist->link;
num=1;
while(q!=llist)
{
q=q->link;
num++;
}
return num;
}
15.
16.