查找
#include<stdio.h>#include<stdlib.h>
#define OK 1
#define ERROR 0
struct llist
{
int data;
struct llist *next;
};
typedef struct llist node;
typedef node *llink;
llink CreatList(int n);
void ListOut(llink L);
void SearchElem(llink L,int value);
void ListInsert(llink L,int i,int value);
void ListDelete(llink L,int i);
void main()
{
int i,k,n,value;
llink L;//定义头指针;
do
{
printf("\n----------------------------------------\n");
printf("1.创建单链表\n");
printf("2.在i位置插入元素value\n");
printf("3.删除第i各元素\n");
printf("4.查找值为value的元素\n");
printf("0.退出\n");
printf("请输入您的选择(1,2,3,4,0)\n");
printf("----------------------------------------\n");
scanf("%d",&k);
switch(k)
{
case 1:
{
printf("请输入元素的个数:\n");
scanf("%d",&n);
printf("\n");
L=CreatList(n);
ListOut(L);
}
break;
case 2:
{
printf("请输入要插入的位置及元素:i,value\n");
scanf("%d,%d",&i,&value);
ListInsert(L,i,value);
ListOut(L);
}
break;
case 3:
{
ListOut(L);
printf("\n");
printf("请输入i的值:\n");
scanf("%d",&i);
ListDelete(L,i);
ListOut(L);
}
break;
case 4:
{
ListOut(L);
printf("请输入要查找的元素值:\n");
scanf("%d",&value);
SearchElem(L,value);
}
break;
case 0:break;
default:printf("输入有误!请重新输入!");
}
}while(k!=0);
}
llink CreatList(int n)
{
int llist;
int i;
llink L,tail,p; //定义头指针,尾指针,p指针
tail=L=(llink)malloc(sizeof(llist));//建立头结点
L->next=NULL;
tail=L; //用tail标记链表尾部
printf("请输入元素的数据:\n");
for(i=0;i<n;i++)
{
p=(llink)malloc(sizeof(llist)); //生成新结点
scanf("%d",&p->data);
p->next=NULL;
tail->next=p; //插入到表尾
tail=p; //更新尾指针
}
return L; //返回链表的头指针
}
void ListOut(llink L)
{
llink p=L->next; //使p指向第一个元素
if(p==NULL)
printf("该链表为空!");
else
{
printf("当前单链表为:\n");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
}
void ListInsert(llink L,int i,int value)
{
int j=0;
int llist;
llink p=L,s;
while(p&&j<(i-1))
{
p=p->next;
++j;
}
if(!p||j>(i-1))
printf("输入有误!请确认\n");
else
{
s=(llink)malloc(sizeof(llist));
s->data=value;
s->next=p->next;
p->next=s;
}
}
void ListDelete(llink L,int i)
{
int j=1;
llink p=L,temp;
while(p->next&&j<(i-1))
{
p=p->next;
++j;
}
if(!(p->next)||j>(i-1))
printf("输入有误!请确认\n");
else
{
for(;p->next&&j<i;p=p->next,j++);
temp=p->next; //保存要删除的结点位置
p->next=temp->next;
free(temp);
}
}
void SearchElem(llink L,int value)
{
llink p=L;
int i;
if(p==NULL)
printf("该单链表为空!\n");
else
{
for(i=0;p->data!=value;i++,p=p->next);
printf("当前查找的元素为第%d个\n",i);}
}