写一个查找方法,实现返回线性表L中第一个与e满足关系compare()的数据元素的位序。
时间: 2023-05-11 22:01:54 浏览: 99
以下是一个简单的查找方法,实现返回线性表L中第一个与e满足关系compare()的数据元素的位序:
int find_first_element(List L, int e, int (*compare)(int, int)) {
int i;
for (i = 0; i < L.length; i++) {
if (compare(L.data[i], e)) {
return i + 1;
}
}
return 0;
}
其中,List是线性表的结构体,包含数据元素和长度信息;e是要查找的元素;compare是一个函数指针,用于比较两个元素是否满足某种关系。函数返回值为第一个满足条件的元素的位序,如果找不到则返回0。
相关问题
在顺序线性表中查找第一个与e满足compare()的元素的位序
好的,针对您的问题,我可以给出以下算法:
1. 初始化计数器i为1,表示从顺序线性表的第一个元素开始查找。
2. 若i大于表长,则查找失败,返回0。
3. 否则,取第i个元素与e进行比较,若compare(e, a[i])为真,则查找成功,返回i。
4. 否则,i加1,重复步骤3。
以下是该算法的C++代码实现:
```c++
int search(SeqList L, ElemType e, int (*compare)(ElemType, ElemType)) {
int i = 1;
while (i <= L.length && !compare(e, L.data[i])) {
i++;
}
if (i <= L.length) {
return i;
} else {
return 0;
}
}
```
其中,`SeqList`表示顺序线性表的类型,`ElemType`表示元素的类型,`compare`是元素比较函数,返回值为`true`或`false`。
写一个C++算法,在带头结点的双链循环线性表L中第i个位置之前插入元素e。
### 回答1:
以下是在带头结点的双链循环线性表L中第i个位置之前插入元素e的C语言代码:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *prior;
struct Node *next;
} Node, *pNode;
pNode init(int a[], int n) {
pNode head, tail;
head = (pNode)malloc(sizeof(Node));
tail = head;
tail->next = head;
for (int i = 0; i < n; i++) {
pNode p = (pNode)malloc(sizeof(Node));
p->data = a[i];
tail->next = p;
p->prior = tail;
tail = p;
}
tail->next = head;
head->prior = tail;
return head;
}
void insert(pNode head, int i, int e) {
pNode p = head;
for (int j = 0; j < i - 1; j++) {
p = p->next;
}
pNode q = (pNode)malloc(sizeof(Node));
q->data = e;
q->prior = p;
q->next = p->next;
p->next->prior = q;
p->next = q;
}
void display(pNode head) {
pNode p = head->next;
while (p != head) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
int a[] = {1, 2, 3, 4, 5};
int n = sizeof(a) / sizeof(a[0]);
pNode head = init(a, n);
insert(head, 3, 9);
display(head);
return 0;
}
```
希望对你有所帮助。
### 回答2:
算法如下所示:
1. 判断L是否为空,如果为空,则输出错误信息并返回。
2. 判断i的合法性,即i的取值范围是否在1到L的长度之间(包括1和L的长度),如果不合法,则输出错误信息并返回。
3. 创建一个新节点p,并将e赋值给p的数据域。
4. 如果i等于1,则将p插入到L的尾部,即将p的后继指针指向L的头节点,将p的前驱指针指向L的尾节点,将L的头节点的前驱指针指向p,将L的尾节点的后继指针指向p。
5. 否则,从L的头节点开始,循环i-1次,找到L中第i个位置之前的节点,记为q。
6. 将p的后继指针指向q的后继节点,将p的前驱指针指向q,将q的后继指针指向p的位置,将p的后继节点的前驱指针指向p。
7. 将L的长度加1,输出插入成功的信息。
该算法的时间复杂度为O(n),其中n为L的长度。
### 回答3:
首先,我们需要定义一个双链循环线性表的结构体:
```c
typedef struct DNode{
ElemType data;
struct DNode *prior,*next;
}DNode, *DLinkList;
```
接下来,我们可以编写插入元素的函数。
```c
Status ListInsert(DLinkList L, int i, ElemType e){
// 判断插入位置的合法性
if(i < 1) return ERROR;
// 寻找第i个结点的位置
DLinkList p = L;
int j = 0;
while(p->next != L && j < i-1){
p = p->next;
j++;
}
if(p->next == L || j > i-1) return ERROR; // 位置不合法
// 在第i个位置之前插入结点
DLinkList s = (DLinkList)malloc(sizeof(DNode));
s->data = e;
s->prior = p;
s->next = p->next;
p->next->prior = s;
p->next = s;
return OK;
}
```
以上是一个在带头结点的双链循环线性表L中第i个位置之前插入元素e的C算法。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![txt](https://img-home.csdnimg.cn/images/20210720083642.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)