绅士得雅痞 2022-06-08 10:02 采纳率: 50%
浏览 38
已结题

循环双链表的插入实现

哪位老哥能帮我看看我的程序哪有问题,为什么会插入不了

img


代码如下
#include <stdio.h>
#include <stdlib.h>
#define initsize 100
typedef struct Dnode
{
int data;
struct Dnode *prior,*next;
}Dnode,*Dlinklist;
Dlinklist tailinsert(Dlinklist &L)
{
int x;
L=(Dlinklist)malloc(sizeof(Dnode));

Dnode *s,*r=L;
scanf("%d",&x);
while(x!=999)
{
    s=(Dnode *)malloc(sizeof(Dnode));
    s->data=x;
    r->next=s;
    s->prior=r;
    r=s;
    scanf("%d",&x);
}
L->prior=r;
r->next=L;
return L;

}
Dnode *getelem(Dlinklist L,int i)
{
int j=1;
Dnode *p=L->next;
if(i==0)
return L;
if(i<1)
return NULL;
while(p&&j<i)
{
p=p->next;
j++;
}
return p;
}
bool cutin(Dlinklist &L,int i,int x)
{
Dnode *p,*s;
s=(Dnode *)malloc(sizeof(Dnode));
s->data=x;
p=getelem(L,i-1);
s->next=p->next;
p->next->prior=s;
p->next=s;
s->prior=p;
return true;
}
bool deleteelem(Dlinklist &L,int i)
{
Dnode *p,*s;
p=getelem(L,i-1);
s=getelem(L,i);
p->next=s->next;
s->next->prior=p;
free(s);
return true;
}
int longlist(Dlinklist L)
{
int i=0;
Dnode *p;
p=L->next;
for(i=0;p!=L;++i)
{
p=p->next;
}
free(p);
return i;
}
bool printflist(Dlinklist L)
{
printf("元素为:\n");
int i=0;
Dnode *p;
p=L->next;
for(i=1;p!=L;i++)
{
printf("%d ",p->data);
p=p->next;
}
return true;
}
int main()
{
Dlinklist L;
printf("插入元素:\n");
tailinsert(L);
printflist(L);
printf("\n查找第三个元素:");
printf("%d\n",getelem(L,3)->data);
printf("表长为%d\n",longlist(L));
cutin(L,1,8);
printf("在第1个位置插入8");
printflist(L);
deleteelem(L,2);
printf("\n删除第二个元素");
printflist(L);
return 0;
}

  • 写回答

1条回答 默认 最新

  • 浩宇哈哈哈哈 2022-06-08 13:18
    关注

    首先指出你的程序错误原因是longlist函数内部应该删除free这行。

    其次针对以上代码给一点建议:

    1. 给变量一个好名字。请参考谷歌编码规范7.1章节通用命名规则https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/naming/#section-2
      例如tailinsert函数里面有两个变量名s、r。我读了很久才知道s是将要插入新元素,r是指向链表的末尾节点。那不妨给s起个有意义的名字叫new_elem好了,r就叫tail,L就叫head。最大的好处是便于你日后review。
      例如cutin函数,改成insert_elem_at

    2. 一个函数只做它应该做的事情。例如tailinsert函数,我通过名称可以猜到它要在末尾插入一个节点。但是它做了一个不该做的事情:做了scanf和while循环;且修改了链表的其他地方(代码中不经释放直接把原链表扔掉了,创建了一个新链表)。如果你要插入多个节点,不妨写一个tail_insert_multi来调用tailinsert

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月16日
  • 已采纳回答 6月8日
  • 创建了问题 6月8日

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。