【问题描述】
实现有头结点单链表查找算法:根据关键字值查找其在单链表中的位置(第一次出现的位置)。
【输入形式】
第一行输入整数n(n不大于1000),表示单链表长度;
第二行输入若干个整数(以非法整数或文件末尾作为结束),表示欲查找的关键字值;
【输出形式】
输出每个关键字值在单链表中的位置。若未找到,输出“no”。
【样例输入】
5
10 56 -34 -2 90
90
-100
34
56
e
【样例输出】
5
no
no
2
单链表的查找算法
链表的访问均从头指针开始,注意有头结点单链表和无头结点单链表访问的区别。
因为只需要顺着链表挨个比较,找到就返回位置,没找到就返回no;
所以直接看代码
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode
{ElemType data;struct LNode *next;
}LNode,*LinkList;LinkList initList();
int insertList(LinkList head, int pos, ElemType e);
int GetIndex(LinkList head, ElemType e);
//初始化
LinkList initList()
{LNode* head;head=(struct LNode*)malloc(sizeof(struct LNode));if(!head)return NULL;head->next=NULL;return head;}
//插入
int insertList(LinkList head, int pos, ElemType e)
{if(pos<1)return 0;LNode* p=head;int i;for(i=1;i<pos;i++){if(p->next==NULL)return 0;p=p->next;}LNode* pnew;pnew=(LinkList)malloc(sizeof(LNode));pnew->data=e;pnew->next=p->next;p->next=pnew;return 1;}
//补充查找算法:若找到返回e在链表中位置,未找到返回0
int getIndex(LinkList head, ElemType e)
{LNode* p=head;int i=1;while(p->next!=NULL){if(p->next->data==e)return i;p=p->next;i++;}return 0;char c;int flag=1;e=0;while(1){c=getchar();if(c>='0'&&c<='9'){e=e*10+(int)c-48;flag=2;}else if(c=='-')flag=0;else if(c=='\n'||c==' '){if(!flag)e=e*(-1);if(!flag&&e==0)break;if(e!=0||flag==2){i=getIndex(head,e);if(i)printf("%d\n",i);else printf("no\n");}e=0;flag=1;}else break;}}
int main()
{LinkList head;ElemType e;int i,n;scanf("%d",&n);head=initList();for(i=0;i<n;i++){scanf("%d",&e);insertList(head,i+1,e);}//补充代码,实现若干个关键字值得查找char c;int flag=1;e=0;while(1){c=getchar();if(c>='0'&&c<='9'){e=e*10+(int)c-48;flag=2;}else if(c=='-')flag=0;else if(c=='\n'||c==' '){if(!flag)e=e*(-1);if(!flag&&e==0)break;if(e!=0||flag==2){i=getIndex(head,e);if(i)printf("%d\n",i);else printf("no\n");}e=0;flag=1;}else break;}return 0;
}
运行结果:
因为e是非法整数,所以可以结束数据输入。或者直接输入 ctrl+z 也可以。