当前位置: 代码迷 >> 综合 >> 实验报告 线性表的基本操作及应用(单链表的创建,插入、删除、查找和打印算法)修改之前i=i+1问题
  详细解决方案

实验报告 线性表的基本操作及应用(单链表的创建,插入、删除、查找和打印算法)修改之前i=i+1问题

热度:18   发布时间:2023-11-22 06:55:21.0

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