按值查找是指在单链表中查找是否有值等于val的结点,在查找的过程中从单链表的的头指针指向的头节点开始出发,顺着链逐个将结点的值和给定的val做比较,返回结果。
代码实现 # include <stdio.h> # include <stdlib.h> #include <cstdlib> //为了总是出现null未定义的错误提示 typedef struct Node { int data; struct Node * pNext; } NODE,*PNODE; PNODE create_list(void) { PNODE pHead = (PNODE)malloc(sizeof(NODE)); pHead->pNext = NULL; printf("请输入要生成的链表的长度:\n"); int n; int val; PNODE r = pHead; scanf("%d",&n); for(int i = 0;i < n;i++) { printf("请输入的第%d个数据",i+1); PNODE p = (PNODE)malloc(sizeof(NODE)); if(NULL == p) { printf("内存分配失败,程序终止运行!"); exit(-1); } scanf("%d",&val); p->data = val; r->pNext = p; p->pNext = NULL; r = p; } return pHead; } //查找按照数值 NODE * getKey(PNODE pHead,int key) { NODE * p; p = pHead->pNext; while(p!=NULL) { if(p->data != key) { p = p->pNext;//这个地方要处理一下,要不然找不到的话就指向了系统的的别的地方了emmm if(p->pNext == NULL) { printf("对不起,没要找到你要查询的节点的数据!"); return p;//这样的话,如果找不到的话就可以退出循环了,而不是一直去指。。。。造成指向了系统内存emmm } } else break; } printf("您找的%d找到了!",p->data) ; return p; } //遍历 void traverse_list(PNODE pHead)//怎样遍历,是不能像以前一样用数组的,以为数组是连续的,这里不连续 { PNODE p = pHead->pNext; while (NULL != p) { printf("%d ", p->data); p = p->pNext; } printf("\n"); } int main(void) { PNODE pHead = NULL; int val; pHead = create_list(); traverse_list(pHead); printf("请输入你要查找的结点的值:"); scanf("%d",&val); getKey(pHead,val); return 0; } 运行演示 算法小结两个算法都是差不多的,第一个按序号查找,定义了一个计数变量j,它有两个作用,第一个作用是记录节点的序号,第二个作用是限制指针指向的范围,防止出现指针指向别的地方。第二个按值查找,当然也可以用相同的方法来限制范围,防止指针指向别的位置。或者和上面写的那样,加一个判断,如果到了表尾,为空了,就退出循环。
线性链表的优缺点 参考文献数据结构-用C语言描述(第二版)[耿国华]
数据结构(C语言版)[严蔚敏,吴伟民]