修改之前的一些小毛病 (很长一段时间都没有检查这个代码,抱歉)
修改位置:在进行查找时将指针p直接指向L->next,避免使用i=i+1
打印删除元素的数据域
查找和删除元素时,P=L,不能出现P=P->next,因为插入删除时可以是在第一个有效数据节点之前,此时的j要保持j=0;
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define FALSE 0
typedef int Status;
typedef float ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode,* LinkList;
LinkList s,r,P;
Status i;
//创建单链表 尾插法
void CreatListTail(LinkList &L,Status n)
{
r=L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
for(i=1;i<=n;++i)
{
s=(LinkList)malloc(sizeof(LNode));
scanf("%f",&s->data);
s->next=NULL;
r->next=s;
r=s;
}
}
//查找
ElemType GetElem(LinkList &L,Status i)
{
LinkList P;
Status j;
P=L->next;
j=1;
while(P&&j<i)
{
P=P->next;
j++;
}
return P->data;
}
//插入
ElemType ListInsert(LinkList &L,int i,ElemType e)
{
Status j;
P=L;
j=0;
while(P&&j<i-1)
{
P=P->next;
++j;
}
if(!P||j>i-1)
{
return FALSE;
}
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=P->next;
P->next=s;
return OK;
}
//打印
void print(LinkList &L)
{
printf("打印单链表:");
LinkList P;
P=L->next;
while(P!=NULL)
{
printf("%.2f ",P->data);
P=P->next;
}
printf("\n");
}
//删除
Status ListDelete(LinkList &L,int i)
{
ElemType e;
Status j;
LinkList q;
P=L;
j=0;
while(P->next&&j<i-1)
{
P=P->next;
++j;
}
if(!(P->next)||j>i-1)
{
return FALSE;
}
q=P->next;
P->next=q->next;
e=q->data;
printf("删除的节点数据为:%.2f\n",e);
free(q);
return e;
}
//菜单
menu(LinkList L)
{
printf(" 欢迎您使用单链表操作系统 \n");
printf("\n");
printf("*************************************************\n");
printf("*1: 打印单链表 *\n");
printf("-------------------------------------------------\n");
printf("*2: 查找单链表中某个位置的元素 *\n");
printf("-------------------------------------------------\n");
printf("*3: 在单链表中插入元素 *\n");
printf("-------------------------------------------------\n");
printf("*4: 在单链表中删除元素 *\n");
printf("*************************************************\n");
Status val,n,i;
ElemType e;
printf("\n");
printf("请按下相应数字进行选择:");
scanf("%d",&val);
switch(val)
{
case 1:print(L);
break;
case 2:
printf("请输入需要查找元素的位置:");
scanf("%d",&n);
printf("获取第%d个元素的值为:%.2f\n",n,GetElem(L,n));
break;
case 3:
printf("请输入需要插入的值:");
scanf("%f",&e);
printf("请输入插入的位置:");
scanf("%d",&i);
ListInsert(L,i,e);
print(L);
break;
case 4:printf("请输删除的节点位置:");
scanf("%d",&i);
ListDelete(L,i);
print(L);
break;
}
}
int main()
{
Status n,i,j,k;
LinkList L,P;
printf("请输入节点个数:");
scanf("%d",&n);
printf("创建单链表(输入每个结点的数据域):");
CreatListTail(L,n);
for(j=0;j<100;j++)
{
printf("是否执行程序(1代表继续执行,0代表终止执行)\n");
scanf("%d",&k);
if(k==1)
{
menu(L);
}
else
{
break;
}
}
return 0;
}