这段代码里写了两种查找,按位置查找,按值查找。
再看代码前有一点瑕疵需要记录。
就是这两个警告。警告的意思就是代码里并不是每一个判断语句里都有返回值。找到警告出现的位置。
就是我写的两个查找的函数里,我为了能够展示出效果来所以写了printf输出语句。
所以为了看到效果,我下面的运行结果图并没有注释这里,所以警告还存在,但是不影响结果。
接下来,为了代码的严谨,我将上面输出语句注释了。修改如下(有两种方案):
- 方案一:函数类型是 int, 结束语句就是 return 1;
- 方案二: 函数类型是 LinkList, 结束语句就是 return p;
#include <stdio.h>
#include <stdlib.h>
// 定义结构
typedef struct Node{
int data;
struct Node *next;
}Node,*LinkList;
// 初始化
LinkList initList () {
LinkList L = (Node *) malloc (sizeof(Node));
L->next = NULL;
return L;
}
// 尾插法插入
void createList(LinkList L) {
Node *r,*s;
int data;
r = L;
printf("输入(以-1结束): ");
while(1) {
scanf("%d",&data);
if(data == -1) return;
s = (Node*) malloc (sizeof(Node));
s->data = data;
r->next = s;
r = s;
}
}
// 打印链表
void printList (LinkList L) {
Node *r;
int data;
r = L->next;
while (r) {
data = r->data;
r = r->next;
printf("%d -> ",data);
}
printf("\n");
}
// 以下标进行查找
LinkList serchIndex(LinkList L, int i) {
Node *p;
int j; // 用来找到 i位置的值
if(i<0) return 0;
p = L;
j = 0;
while((p->next != NULL) && (j<i)) {
p = p->next;
j++;
}
if(i==j) {
// printf("链表中第%d个位置的值是%d\n",j,p->data);
return p;
} else {
return 0;
}
}
// 根据值查找
LinkList searchKey(LinkList L, int data) {
Node *p;
if(!data) return 0;
p = L->next;
while (p) {
if(p->data != data) {
p = p->next;
} else break; // while里的这个跳出还是要写的,不然不会结束进程
}
return p;
// printf("找到值%d\n",p->data);
}
// 主函数
int main () {
LinkList L;
L = initList();
createList(L);
printList(L);
serchIndex(L,2);
searchKey(L,23);
return 0;
}