修改之前的一些小毛病 (很长一段时间都没有检查这个代码,抱歉)
修改位置:在进行查找时将指针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; }