数据结构第二章课后习题题解
free(pre);
return temp;
}
2.10已知有单链表表示的线性表中含有三类字符的数据元素(如字母字符、数字字符和其他字符),试编写算法来构造三个以循环链表表示的线性表,使每个表中只含同一类字符,且利用原表中的结点空间作为这三个表的结点空间,头结点可另辟空间。
解:
LinkList_Divide(LinkList &L,CiList &A,CiList &B,CiList &C)
解:
ElemType DeletePreElem (Node *s)
{
ElemType temp;
Node *p,*pre;
p=s;
while(p->next!=s)
p=p->next;
pre=p;
while(p->next!=pre)
p=p->next;
p->next=s;
temp=pre->data;
pb=B->next;
while(pa!=NULL&&pb!=NULL)
{
r->next=pa;
r=pa;
pa=pa->next;
r->next=pb;
r=pb;
pb=pb->next;
if(pa==NULL)
r->next=pb;
else
r->next=pa;
return(C);
}
}
2.12将一个用循环链表表示的稀疏多项式分解成两个多项式,使这两个多项式中各自仅含奇次项或偶次项,并要求利用原链表中的结点空间来构成这两个链表。
}
return OK;
}
(2)以单链表作存储结构。
解:
int ReversePosition(Linklist L)
{
Node *NL,q,r;
q=L;
r=L;
NL=L->next;
if(NL==NULL)
return ERROR;
while(q->next!=NULL)
{
q=q->next;
r->next=q;
i++;
for(k=L->last;k>=I;k--)
L->elem[k+1]=L->elem[k];
L->elem[i]=X;
L->last++;
return(OK);
}
2.5写一算法,从顺序表中删除自第i个元素开始的k个元素。
解:
int LDel(Seqlist *L,int i,int k)
{
{
DNode *p,*s;
p=DL;
while(p->prior!=DL)
{
p=p->prior;
if(p->data==0)
{
p->data=1;
break;
}
if(p->data==1)
{
p->data=0;
if(p->prior==DL)
{
s=(DNode *)malloc(sizeof(DNode));
解:
int Delete(Linklist,int mink,int maxk)
{
Node *p,*q;
p=L;
while(p->next!=NULL)
p=p->next;
if(mink>=maxk||L->next->data>=maxk||mink+1=maxk)
{
printf("参数不合法!");
{
if(p-&;
else
Greate(RA,p);
p=p->next;
}
}
2.13建立一个带头节点的线性表,用以存放输入的二进制数,链表中每个结点的data域存放一个二进制位,并在此链上实现对二进制数加1的运算。
解:
void BinnaryFod(Dlinklist DL)
RL->next=e;
RL=RL->next;
RL->next=p;
}
void DescouposeList(Linklist RL Descoupose RA Descoupose RB)
{
Node *p;
p=RL->next;
if(p->next=NULL)
return;
p=p->next;
while(p!=RL->next)
C=(a1,b1,…,am,bm,bm+1,…,bn)当m<=n时
线性表A、B、C均以单链表作为储存结构,且C表利用A表和B表中的结点空间构成。
解:
Liklist merge(Linklist A Linklist B)
{
Linklist C;
Node *pa,*pb,*r;
C=A;
r=A;
pa=A->next;
(1)以顺序表作存储结构。
解:
int ReversePosition(SpList L)
{
int k,temp,len;
int j=0;
k=L->last;
len=L->last+1;
for(j;j<len/2;j++)
{
temp=L->elem[k-j];
elem[k-j]=elem[j];
elem[j]=temp;
q1->next=LC->next;
LC->next=q;
q1=q2;
}
else
{
p2=p1->next;
p1->next=LC->next;
LC->next=p1;
p1=p2;
}
}
2.9假设有一个循环链表的长度大于1,且表中既无头结点也无头指针。已知s为指向链表某个结点的指针,试编写算法在链表中删除指针s所指结点的前驱结点。
解:
typedef struct Polynode
{
int coef;
int exp;
struct polynode *next;
}Polynode *PolyList;
void GreateCircle LinklistC(Linklist RL,Node *e)
{
Node *p;
p=RL->next;
//把单链表L的元素按类型分为三个循环链表.CiList为带头结点的单循环链表类型.
{
s=L->next;
A=(CiList*)malloc(sizeof(CiLNode));
p=A;
B=(CiList*)malloc(sizeof(CiLNode));
q=B;
C=(CiList*)malloc(sizeof(CiLNode));
r=C; //建立头结点
while(s!=NULL)
{
if(s->data>='a'&&s->data<='z'||s->data>='A'&&s->data<='Z')
{
p->next=s;
p=s;
}
else if(s->data>='0'&&s->data<='9')
{
q->next=s;
q=s;
2.4已知顺序表L递增有序,试写一算法,将X插入到线性表的适当位置上,以保持线性表的有序性。
解:
int InsList(SeqList *L,int X)
{
int i=0,k;
if(L->last>=MAXSIZE-1)
{
printf("表已满无法插入!");
return(ERROR);
}
while(i<=L->last&&L->elem[i]<X)
解:
void merge(SepList *LA,SepList *LB,SepList *LC)
{
Node *p1,*p2,*q1,*q2;
LA->next=p1;
LB->next=q1;
while(p1!=NULL&&q1!=NULL)
if(p1->data>q1->data)
{
q2=q1->next;
}
else
{
r->next=s;
r=s;
}
}
p->next=A;
q->next=B;
r->next=C;
}
2.11设线性表A=(a1,a2,…,am),B=(b1,b2,…,bn),试写一个按下列规则合并A、B为线性表C的算法,使得
C=(a1,b1,…,an,bn,an+1,…,am)当m>n时
或者
if(i=1||(i+k>L->last+1))
{
printf("输入的i,k值不合法");
return(ERROR);
}
else if(i+k==L->last+2)
{
L->last=i-2;