单链表的查找和删除
#include<stdio.h>#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
LinkList CreatList(int n);
void ListOut(LinkList L);
void SearchElem(LinkList L,ElemType value);
void ListInsert(LinkList L,int i,ElemType value);
void ListDelete(LinkList L,int i);
void main()
{
int i,k,n,value;
LinkList 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);
}
LinkList CreatList(int n)
{
int i;
LinkList L,tail,p; //定义头指针,尾指针,p指针
tail=L=(LinkList)malloc(sizeof(LNode));//建立头结点
L->next=NULL;
tail=L; //用tail标记链表尾部
printf("请输入元素的数据:\n");
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(LNode)); //生成新结点
scanf("%d",&p->data);
p->next=NULL;
tail->next=p; //插入到表尾
tail=p; //更新尾指针
}
return L; //返回链表的头指针
}
void ListOut(LinkList L)
{
LinkList p=L->next; //使p指向第一个元素
if(p==NULL)
printf("该链表为空!");
else
{
printf("当前单链表为:\n");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
}
void ListInsert(LinkList L,int i,ElemType value)
{
int j=0;
LinkList p=L,s;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
printf("输入有误!请确认\n");
else
{
s=(LinkList)malloc(sizeof(LNode));
s->data=value;
s->next=p->next;
p->next=s;
}
}
void ListDelete(LinkList L,int i)
{
int j=1;
LinkList 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(LinkList L,ElemType value)
{
LinkList p=L;
if(p==NULL)
printf("该单链表为空!\n");
else
{
for(int i=0;p->data!=value;i++,p=p->next);
printf("当前查找的元素为第%d个\n",i);
}
}
删除和查找都不能报错,
如果选择删除之后,输入一个大于超出链表的位置,就不能继续运行了,
查找也是
如果把查找换成
void SearchElem(LinkList L,ElemType value)
{
LinkList p=L->next;int i=1,j;
if(p==NULL)
printf("该单链表为空!\n");
else
for(j=1;p->next!=NULL;p=p->next,j++);
//p=L->next;
while(p->data!=value&&p->next!=NULL)
{
i++;
p=p->next;
}
if(i=j+2&&p->data!=value)
printf("找不到该元素!");
else
printf("当前查找的元素为第%d个\n",i);
}
输出的位置永远是0
求解!!...非常感谢!!