P17 2.13
试写一算法在带头结点的单链表结构上实现线性表操作LOCATE(L,x)。
代码实现:
int LOCATE(LinkList L, int X) {
int i = -1;
LNode *p = L;
while (p != NULL) {
i++;
if (p->data == X) {
return i;
}
p = p->next;
}
return -1;
}
完整代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode {
int data;//数据域
struct LNode *next;//指针域
} LNode, *LinkList;
LinkList Create_list(LinkList L) { //尾插法构建链表
L = (LinkList)malloc(sizeof(LNode)); //头结点
L->next = NULL;
int x;
LNode *p, * r;
r = L;//尾指针
scanf("%d", &x);
while (x != 9999) {
p = (LNode *)malloc(sizeof(LNode));
p->data = x;
r->next = p;
r = p;
scanf("%d", &x);
}
r->next = NULL; //注意
return L;
}
int LOCATE(LinkList L, int X) {
int i = -1;
LNode *p = L;
while (p != NULL) {
i++;
if (p->data == X) {
return i;
}
p = p->next;
}
return -1;
}
int main() {
LinkList L = NULL; //声明链表
printf("请输入链表的值(输入9999结束):\n");
L = Create_list(L); //构建链表
printf("输出链表:\n");
LNode *p = L->next; //从第一个结点开始遍历
while (p) {
printf("%d\t", p->data);
p = p->next;
}
printf("\n");
int X, i;
printf("请输入X的值:\n");
scanf("%d", &X);
i = LOCATE(L, X);
if (i == -1) {
printf("链表不存在数据%d\n", X);
} else {
printf("%d在链表的第%d个结点\n", X, i);
}
return 0;
}