数据结构习题集 下载本文

{printf(“overflow\; return 0;} else

for(i=L->n;i>=0;i--) if(L->data[i]>x

L->data[i+1]=L->data[i]; else break; L->data[i+1]=x; L->n++; return 1; }

2.逐个查找单链表中的结点x,并计数。 int number(lnode *h,int x) { int n=0; while(h) {if(h->data==x) n++;

h=h->next; }

return s; }

3.前插法建立带表头结点的单链表算法中的tag为输人数据结束标志。Lnode *createhh(int tag) { int x;

Lnode *p,*h=(Lnode *)malloc(sizeof(Lnode)); h->next=NULL; printf(“input x:”); scanf(“%d”,&x); while(x!=tag)

{p=(Lnode*)malloc(sizeof(Lnode)); p->data=x; p->next=h->next; h->next=p; scanf(“%d”,&x); } return h; }

49

4.先建立一个表头结点,用尾插法建立该单链表。然后将尾结点的指针域值置为表中第一个结点的首地址,最后释放表头结点。算法描述如下:

Lnode *createht(int tag) { int x;

Lnode *p,*r,*h=(Lnode *)malloc(sizeof(Lnode)); r=h;

printf(“input x:”); scanf(“%d”,&x); while(x!=tag)

{p=(Lnode*)malloc(sizeof(Lnode)); p->data=x; r->next=p; r=p;

scanf(“%d”,&x); }

r->next=h->next; free(h); return r; }

5.设p指向待逆置链表中的第一个结点,先将表头结点的链域置空。顺次取出待逆置链表中的第一个结点,用前插法插入到带表头结点的单链表中。

Void reverseh(Lnode *h) { Lnode *s,*p=h->next; h->next=NULL; while(p) {s=p;p=p->next; s->next=h->next; h->next=s; } }

6.逐个检测顺序表中其值在x和y之间的元素,并计数k,再将其值大于y的元素向前移动k个元素。算法描述如下:

void deletexy(Slist *a,int x,int y) { int i,k=0;

for(i=0;in;i++)

if(a->data[i]>=x&&a->data[i]<=y) k++;

50