int i, j, n = 0; LNode* p = L; ElemType e; char name[20]; //模糊查找的字符串 printf("请输入你要查找的关键字:"); getchar(); gets(name); char Listname[20]; //接收链表中的名字 while (p) { e = (p->next)->data; strcpy(Listname, e.publisher); for (i = 0; i < strlen(Listname); i += 2) { for (j = 0; j < strlen(name); j += 2) { if (Listname[i] == name[j] && Listname[i + 1] == name[j + 1]) { n++; } } } if (n == strlen(name) / 2) { printf("%s %d\n", e.name, e.num); } n = 0; p = p->next; }
时间: 2024-01-18 19:02:04 浏览: 26
这段代码是用来进行链表中名字的模糊查找。首先,用户需要输入一个关键字,该关键字将用于模糊匹配链表中的名字。然后,该代码将遍历链表中的每个节点,并将节点中的名字与关键字进行匹配。匹配的方式是将名字中的每两个字符作为一个单位,与关键字中的每两个字符进行比较,如果匹配成功,则计数器n加1。最后,如果n等于关键字长度除以2,则说明该节点名字与关键字匹配成功,将该节点的书名和数量输出。
相关问题
int i, j, n = 0; LNode* p = L; ElemType e; char name[20]; //模糊查找的字符串 printf("请输入你要查找的关键字:"); getchar(); gets(name); char Listname[20]; //接收链表中的名字 while (p) { e = (p->next)->data; strcpy(Listname, e.publisher); for (i = 0; i < strlen(Listname); i += 2) { for (j = 0; j < strlen(name); j += 2) { if (Listname[i] == name[j] && Listname[i + 1] == name[j + 1]) { n++; } } } if (n == strlen(name) / 2) { printf("%s %d\n", e.name, e.num); } n = 0; p = p->next; }
这段代码中有一个语法错误,即使用了不安全的gets()函数,这个函数无法检查输入是否超过数组长度,容易导致缓冲区溢出。建议使用安全的fgets()函数替代。修改后的代码如下:
```c
int i, j, n = 0;
LNode* p = L;
ElemType e;
char name[20]; // 模糊查找的字符串
char Listname[20]; // 接收链表中的名字
printf("请输入你要查找的关键字:");
fgets(name, 20, stdin); // 使用安全的fgets()函数读入关键字
while (p) {
e = (p->next)->data;
strcpy(Listname, e.publisher);
for (i = 0; i < strlen(Listname); i += 2) {
for (j = 0; j < strlen(name); j += 2) {
if (Listname[i] == name[j] && Listname[i + 1] == name[j + 1]) {
n++;
}
}
}
if (n == strlen(name) / 2) {
printf("%s %d\n", e.name, e.num);
}
n = 0;
p = p->next;
}
```
另外,如果关键字的长度超过了20个字符,fgets()函数只会读取前20个字符,可以根据实际需求调整输入缓冲区的大小。
#include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef enum{false=0,true=1}bool; typedef struct node{ ElemType data; struct node *next; }Lnode,*Linklist; //初始化单链表 bool InitList(Lnode*&L); //(头插法)创建单链表 void CreateListListF(Lnode *&L,ElemType a[],int n); //初始化单链表 bool InitList(Lnode *L){ L=(Lnode*)malloc(sizeof(Lnode)); L->next=NULL; if(L==NULL)//内存不足,头结点无法分配到空间 return false; return true; } //(头插法)创建单链表 void CreateListF(Lnode *&L,ElemType a[],int n){ Linklist s; L=(Lnode*)malloc(sizeof(Lnode)); L->next=NULL; int j=0; for(j=0;j<n;j++){ s=(Lnode *)malloc(sizeof(Lnode)); s->data=a[j]; s->next=L->next; L->next=s; } }
这段代码是用C语言实现的单链表的初始化和创建,其中包括了头插法创建单链表的函数。代码中定义了一个结构体node,它包含了一个数据域data和一个指向下一个结点的指针next。代码中还定义了一个typedef枚举类型bool,用来表示true和false。函数InitList用来初始化单链表,函数CreateListF用来通过头插法创建单链表。函数的具体实现如下:
```c
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef enum{false=0,true=1}bool;
typedef struct node{
ElemType data;
struct node *next;
}Lnode,*Linklist;
// 初始化单链表
bool InitList(Lnode*& L){
L=(Lnode*)malloc(sizeof(Lnode));
L->next=NULL;
if(L==NULL) // 内存不足,头结点无法分配到空间
return false;
return true;
}
// 头插法创建单链表
void CreateListF(Lnode*& L, ElemType a[], int n){
Linklist s;
L=(Lnode*)malloc(sizeof(Lnode));
L->next=NULL;
int j=0;
for(j=0;j<n;j++){
s=(Lnode *)malloc(sizeof(Lnode));
s->data=a[j];
s->next=L->next;
L->next=s;
}
}
```
你有什么其他问题吗?