单链表插入和删除算法 问题

wyongliang 2009-07-30 10:39:03
插入算法

Status ListInsert_L(LinkList &L,int i,ElemType e){
// 带头结点的单链表L中第i个位置前插入元素e
p=L,j=0;

while(p&&j<i-1){p=p->next;++j;}

if(!p||j>i-1) return ERROR;

s=(LinkList)malloc(sizeof(LNode));

s->data=e;s->next=p->next;

p->next=s;

return OK;

}//ListInsert_L


1,最后一个结点后面可以插入结点吗?因为我看的结果是:如果i=(线性表长度+1),那么执行while语句最后p=null 则不执行插入算法!这里的i位置前 i包括最后结点后面吗?
2,如果是空链表,则p=L=null ,那么就不执行while语句 并且直接执行if后面语句返回ERROR
那就是不能在空链表上插入数据?

删除算法

Status ListDelete_L(LinkList &L,int i,ElemType &e){

p=L,j=0;

while(p-->next&&j<i-1){p=p->next;++j;}

if(!(p->next)||j>i-1) return ERROR;

q=p->next;p->next=q->next;

e=q->data;free(q);

return OK;

}//ListDelete_L



为什么删除算法中的while循环里面条件是p-next 而不是p了??
...全文
781 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
i 可以取0(插在第一)到L(插在最后)

[Quote=引用 6 楼 wyongliang 的回复:]
插入算法中 如果L是带头结点的空链表 如何插入数据
此时 如果i可以取什么值?
取0啊
好像唯一可以取i=1
如果i=1的话
while循环执行一次 此时p=p-->next==null
那么下面就执行if语句了
就不能插入数据了 为什么啊 各位大哥 指点下啊
[/Quote]
wyongliang 2009-07-31
  • 打赏
  • 举报
回复
插入算法中 如果L是带头结点的空链表 如何插入数据
此时 如果i可以取什么值?
好像唯一可以取i=1
如果i=1的话
while循环执行一次 此时p=p-->next==null
那么下面就执行if语句了
就不能插入数据了 为什么啊 各位大哥 指点下啊
LeonTown 2009-07-31
  • 打赏
  • 举报
回复
或许,可以将在i之前插入,
改为在i-1之后插入;
检查i-1是否小于0
wyongliang 2009-07-31
  • 打赏
  • 举报
回复
我顶 我顶 我顶 我顶 我顶 我顶 我顶 我顶 我顶
wyongliang 2009-07-31
  • 打赏
  • 举报
回复
i取0直接执行if语句返回错误啊
我看错了???
wyongliang 2009-07-30
  • 打赏
  • 举报
回复
我自己顶
henry11 2009-07-30
  • 打赏
  • 举报
回复
回帖是一种美德!
wyongliang 2009-07-30
  • 打赏
  • 举报
回复
初始化链表以后 链表不就是空的吗?
wyongliang 2009-07-30
  • 打赏
  • 举报
回复
上面的算法中 没有看到有L初始化啊
我是菜鸟 麻烦详细解释 可以吗
  • 打赏
  • 举报
回复
为什么删除算法中的while循环里面条件是p-next 而不是p了??
因为p->Next对应的节点才是第I个节点

1,最后一个结点后面可以插入结点吗?可以 因为我看的结果是:如果i=(线性表长度+1),那么执行while语句最后p=null 则不执行插入算法!这里的i位置前 i包括最后结点后面吗?

2,如果是空链表,则p=L=null ,那么就不执行while语句 并且直接执行if后面语句返回ERROR
那就是不能在空链表上插入数据?

是的,所以需要初始化L



数据结构单链表插入删除和修改实验报告 一、实验目的 1.理解数据结构中带头结点单链表的定义和逻辑图表示方法。 2.掌握单链表中结点结构的JAVA描述。 3.熟练掌握单链表插入删除和查询算法的设计与JAVA实现。 4.熟练掌握简单的演示菜单与人机交互设计方法。 二、实验内容 1. 编制一个演示单链表插入删除、查找等操作的程序。 三、实验步骤 1.需求分析 本演示程序用JAVA编写,完成单链表的生成,任意位置的插入删除,以及确定某一元素在单链表中的位置。 ① 输入的形式和输入值的范围:插入元素时需要输入插入的位置和元素的值;删除元素时输入删除元素的位置;查找操作时需要输入元素的值。在所有输入中,元素的值都是整数。 ② 输出的形式:在所有三种操作中都显示操作是否正确以及操作后单链表的内容。其中删除操作后显示删除的元素的值,查找操作后显示要查找元素的位置。   ③ 程序所能达到的功能:完成单链表的生成(通过插入操作)、插入删除、查找操作。 ④ 测试数据:  A. 插入操作中依次输入11,12,13,14,15,16,生成一个单链表    B. 查找操作中依次输入12,15,22返回这3个元素在单链表中的位置    C. 删除操作中依次输入2,5,删除位于2和5的元素 2.概要设计 1)为了实现上述程序功能,需要定义单链表的抽象数据类型:   ADT LinkList {    数据对象:D={ai|ai∈IntegerSet,i=0,1,2,…,n,n≥0}    数据关系:R={|ai,ai+1 ∈D}    基本操作: (1)insert 初始化状态:单链表可以不为空集;操作结果:插入一个空的单链表L。   (2)decelt     操作结果:删除已有的单链表的某些结点。 (3)display     操作结果:将上述输入的元素进行排列显示。    (4)modify     操作结果:将上述输入的某些元素进行修改。    (5)save     操作结果:对上述所有元素进行保存。    (6)load     操作结果:对上述元素进行重新装载。   }   2)本程序包含7个函数:   ① 主函数main()   ② 保存单链表函数save()   ③ 重载操作菜单函数load()   ④ 显示单链表内容函数display ()   ⑤ 插入元素函数insert ()   ⑥ 删除元素函数decelt ()   ⑦ 修改元素函数modify()   各函数间关系如下: 3.详细设计   实现概要设计中定义的所有的数据类型,对每个操作给出伪码算法。对主程序和其他模块也都需要写出伪码算法。   1) 结点类型和指针类型   typedef struct node {    int data;    struct node *next;   }Node,*singleLIST.java;   2) 单链表的基本操作   为了方便,在单链表中设头结点,其data域没有意义。 bool insert(singleLIST) (伪码算法)   bool modify(singleLIST) (伪码算法)   void delect(singleLIST)   (伪码算法)   void display()   (伪码算法) 3) 其他模块伪码算法 4.调试分析   (略) 5.使用说明 程序名为 ,运行环境为Windows。程序执行后显示   ========================   0----EXIT   1----INSERT   2----DELETE   3----DISPLAY 4----MODIFY 5----EXIST =======================   SELECT:   在select后输入数字选择执行不同的功能。要求首先输入足够多的插入元素,才可以进行其他的操作。每执行一次功能,就会显示执行的结果(正确或错误)以及执行后单链表的内容。 选择5:退出程序   选择1:显示"INSERT =" ,   要求输入要插入的位置和元素的值(都是整数)。   选择2:显示"DELETE =" ,   要求输入要删除元素的位置,执行成功后返回元素的值。   选择3:显示"MODIFY = " , 选择要修改的对象,执行成功后返回新的元素值。 选择4:显示"DIAPLAY= "   显示所有单链表中的元素,自动进行排序。

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧