数据结构应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构应用
– 1. 有一个有n个结点的单链表,设计一个函数将第i-1个结点与第i个结点互换,但指针不变。
– 2. 设计一个函数,查找单链表中数值为x的结点。
– 3. 已知一个单链表,编写一个删除其值为x的结点的前趋结点的算法。
– 4. 已知一个单链表,编写一个函数从此单链表中删除自第i个元素起的length个元素。
– 5. 已知一个递增有序的单链表,编写一个函数向该单链表中插入一个元素为x的结点,使插入后该链表仍然递增有序。
– 6. 已知一个单链表,编写一个函数将此单链表复制一个拷贝。
– 7. 有一个共10个结点的单链表,试设计一个函数将此单链表分为两个结点数相等的单链表。
– 8. 与上题相同的单链表,设计一个函数,将此单链表分成两个单链表,要求其中一个仍以原表头指针head1作表头指针,表中顺序包括原线性表的第一、三等奇数号结点;另一个链表以head2为表头指针,表中顺序包括原单链表第二、四等偶数号结点。
– 9. 已知一个指针p指向单循环链表中的一个结点,编写一个对此单循环链表进行遍历的算法。
– 10. 已知一个单循环链表,编写一个函数,将所有箭头方向取反。
– 11. 在双链表中,若仅知道指针p指向某个结点,不知头指针,能否根据p遍历整个链表?若能,试设计算法实现。
– 12. 试编写一个在循环双向链表中进行删除操作的算法,要求删除的结点是指定结点p的前趋结点。
– 1. 解:本题的算法思想是:要使结点互换而指针不变,只要将两个结点的数据进行交换即可。实现本题功能的函数如下:
void exchange(node *head,int i,n)
{
node *p,*q;
int data;
if(i>n)
printf("error!\n");
else
{
p=head;
for(int j=1;j
p=p->next;
q=p->next;
data=q->data;
q->data=p->data;
p->data=data;
}
}
– 2. 解:实现本题功能的函数如下: void search(node *head,int x)
{
node *p;
p=head;
while(p->data!=x && p!=NULL) p=p->next;
if(p!=NULL)
printf("结点找到了!\n"); else
printf("结点未找到!\n");
}
– 3. 解:本题的算法思想是:先找到值为x的结点*p和它的前趋结点*q,要删除*q,只需把*p的值x 放到*q的值域中,再删除结点*p即可。实现本题功能的函数如下:
void delete(node *head,int x)
{ node *p,*q;
q=head;
p=head->next;
while((p!=NULL) && (p->data!=x))
{ q=p;
p=p->next;
}
if(p==NULL)
printf("未找到x!\n");
else if(q==head)
printf("x为第一个结点,无前趋!\n");
else
{
q->data=x;
q->next=p->next;
free(p);
}
}
– 4. 解:实现本题功能的函数如下:
void deletelength(node *head,int i,int length)
{ node *p,*q;
int j;
if(i==1)
for(j=1;j<=length;j++) /*删除前k个元素*/
{ p=head; /*p指向要删除的结点*/
head=head->next;
free(p);
}
else
{ p=head;
for(j=1;j<=i-2;j++)
p=p->next;/*p指向要删除的结点的前一个结点*/ for(j=1;j<=length;j++)
{
q=p->next; /*q指向要删除的结点*/
p->next=q->next;
free(q);
}
}
}
– 5. 解:本题算法的思想是:先建立一个待插入的结点,然后依次与链表中的各结点的数据域比较大小,找到插入该结点的位置,然后插入该结点。实现本题功能的函数如下:
void insert(node *head,int x)
{
node *s,*p,*q;
s=(node *)malloc(sizeof(node));
/*建立一个待插入的结点*/
s->data=x;
s->next=NULL;
if(head==NULL||x
/*若单链表为空或x小于第一个结点data域*/
{
s->next=head; /*插入到表头后面*/
head=s;
}
else
{
q=head;
p=q->next;
while(p!=NULL && x>p->data)
{
q=p;
p=p->next;