Status LocateElemP(LinkList L, ElemType e, Position *q, int(*compare)(ElemType, ElemType)) { /* 若升序链表L中存在与e满足判定函数compare()取值为0的元素,则q指示L中 */ /* 第一个值为e的结点的位置,并返回TRUE;否则q指示第一个与e满足判定函数 */ /* compare()取值>0的元素的前驱的位置。并返回FALSE。(用于一元多项式) */ Link p = L.head, pp; do { pp = p; p = p->next; } while (p && (compare(p->data, e)<0)); /* 没到表尾且p->data.expn<e.expn */ if (!p || compare(p->data, e)>0) /* 到表尾或compare(p->data,e)>0 */ { *q = pp; return FALSE; } else /* 找到 */ {/* 没到表尾且p->data.expn=e.expn */ *q = p; return TRUE; } }
时间: 2024-04-20 18:25:38 浏览: 80
这段代码是用于在升序链表中查找满足特定条件的元素。
函数`LocateElemP`接受一个升序链表`L`,要查找的元素`e`,一个指向位置的指针`q`,以及一个用于比较两个元素大小的函数指针`compare`作为参数,并返回一个状态值。
代码中使用指针`p`初始化为链表的头节点,然后通过一个循环遍历链表,在每次循环中,将指针`pp`指向当前节点`p`,然后将指针`p`指向下一个节点。循环的条件是:没有到达链表尾部并且当前节点的数据域与要查找的元素满足判定函数`compare`的取值小于0。
如果循环结束后,指针`p`为空或者当前节点的数据域与要查找的元素满足判定函数`compare`的取值大于0,则表示没有找到满足条件的元素。此时,将指针`q`指向指针`pp`所指向的位置,并返回FALSE。
如果循环结束后,当前节点的数据域与要查找的元素满足判定函数`compare`的取值等于0,则表示找到了符合条件的元素。此时,将指针`q`指向指针`p`所指向的位置,并返回TRUE。
需要注意的是,函数中使用的判定函数`compare`应满足以下规则:
- 若`compare(a, b) < 0`,表示`a`小于`b`
- 若`compare(a, b) = 0`,表示`a`等于`b`
- 若`compare(a, b) > 0`,表示`a`大于`b`
相关问题
请用 C 语言编写算法将两个给定的有序单链表(带头结点)合并成一个有序单链表,要求使用两个有序单链表的原有空间进行合并。 typedef int elemtype ; typedef struct Node{ elemtype data ; struct Node * next ; } Inode , linklist ;//单链表定义 int empty ( linklist * A );//判断链表是否为空,返回值为0则链表为空 int length ( linklist * A );//返回单链表 A 的长度 请使用以上定义和基本操作完成如下函数定义。 linklist * merge(linklist * A,linklist * B);//假设单链表A、B已经有序,返回合并后的单链表头指针
下面是使用 C 语言编写的算法,将两个有序单链表合并成一个有序单链表:
```c
linklist * merge(linklist * A, linklist * B)
{
Inode *p = A->next, *q = B->next, *s = A;
while (p != NULL && q != NULL) {
if (p->data <= q->data) {
s->next = p;
s = p;
p = p->next;
} else {
s->next = q;
s = q;
q = q->next;
}
}
if (p != NULL) {
s->next = p;
}
if (q != NULL) {
s->next = q;
}
free(B);
return A;
}
```
该函数的主要思路是使用两个指针 `p` 和 `q` 分别指向链表 A 和 B 的第一个结点,然后比较它们的值,将较小的值插入到新的链表中,直到其中一个链表为空。最后将另一个链表剩余的结点直接插入到新的链表的末尾即可。最后释放链表 B 的头结点,返回链表 A 的头指针。
#include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct Node { ElemType data; struct Node * next; }Node,* Linklist; //采用循环链表来储存数据 void InitList(Linklist L) { L=(Linklist)malloc(sizeof(Node)); L->next=L; } //建立链表 void CreatFromTail(Linklist L) { Node * rear,* s; int n; rear=L; scanf("%d",&n); while(n!=0) { s=(Node *)malloc(sizeof(Node)); s->data=n; rear->next=s; rear=s; scanf("%d",&n); } rear->next=L; } //尾插法建表 void OutList(Linklist L) { Node * p; p=L->next; if(p==NULL) { printf("链表为空"); } while(p->data)//值不为空时输出 { printf("%d ",p->data); p=p->next; } } //输出循环链表 void DelList(Linklist L,ElemType * e,int i) { Node * pre,*r; int k; if(i<=0) printf("ERROR"); pre=L;k=0; while(pre!=NULL&&k<i-1) { pre=pre->next; k=k+1; } if(pre->next==NULL) { printf("删除位置不合法"); } r=pre->next; pre->next=r->next; * e=r->data; free (r); } //删除结点函数 int main() { Linklist L; InitList(L); CreatFromTail(L); OutList(L); int m=4; ElemType * e=0; DelList(L,e,m); OutList(L); return 0; }
这段代码存在一些问题:
1.在InitList函数中,应该传入Linklist *L的指针,否则无法修改传入的指针。
2.在CreatFromTail函数中,链表的尾节点应该指向头节点L,而不是直接将rear指向L。
3.在OutList函数中,判断链表为空的条件应该是L->next == L,而不是L->next == NULL。
4.在DelList函数中,应该判断i的合法性,如果i<=0或i超过链表长度,则应该输出错误信息。
5.在DelList函数中,如果删除的是最后一个节点,需要将尾节点rear指向删除节点的前一个节点pre。
6.在main函数中,指向ElemType类型的指针e没有分配空间,应该先分配空间再调用DelList函数。
下面是修改后的代码:
```
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node {
ElemType data;
struct Node *next;
} Node, *Linklist;
void InitList(Linklist *L) {
*L = (Linklist)malloc(sizeof(Node));
(*L)->next = *L;
}
void CreatFromTail(Linklist L) {
Node *rear = L, *s;
int n;
scanf("%d", &n);
while (n != 0) {
s = (Node *)malloc(sizeof(Node));
s->data = n;
rear->next = s;
rear = s;
scanf("%d", &n);
}
rear->next = L;
}
void OutList(Linklist L) {
Node *p = L->next;
if (p == L) {
printf("链表为空");
return;
}
while (p != L) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void DelList(Linklist L, ElemType *e, int i) {
if (i <= 0) {
printf("删除位置不合法");
return;
}
Node *pre = L, *r;
int k = 0;
while (pre->next != L && k < i - 1) {
pre = pre->next;
k++;
}
if (pre->next == L) {
printf("删除位置不合法");
return;
}
r = pre->next;
pre->next = r->next;
if (r == L) {
L = pre;
}
*e = r->data;
free(r);
}
int main() {
Linklist L;
InitList(&L);
CreatFromTail(L);
OutList(L);
int m = 4;
ElemType *e = (ElemType *)malloc(sizeof(ElemType));
DelList(L, e, m);
OutList(L);
return 0;
}
```
阅读全文