删除无头结点的单链表中从第i个结点开始的连续k个结点

LouisQ007 2011-03-19 03:34:30
刚开始学数据结构,学的有点迷糊,知识点都乱了.今天写这个题目,一步步调试搞了半天,还是有问题没有搞定.求指教!
希望能给出改进的意见,万分感谢!

/*已知PLink是指向无头结点的单链表的指针变量,写出删除该链表中从第i个结点开始的连续k个结点的算法。 */
//bug: 当i为1时,程序出错,第56行的PLink不能将值带回到main函数.

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
int data;
struct node *next;
}LNode, *LinkList;

LinkList init_link()
{
LinkList H;
H = (LinkList)malloc(sizeof(LNode));
if (H == NULL)
{
printf("内存分配失败!\n");
return 0;
}

return H;
}

int delete_link(LinkList PLink, int i, int k)
{
int j = 0;
LinkList P1;//第i个结点的指针
LinkList P2;//第i-1个结点的指针
LinkList P3;//第k个结点的指针
LinkList P4;

if (PLink == NULL)
{
printf("链表不存在!\n");
return 0;
}

P1 = PLink;
P2 = P1;

if (i == 1)
{
P3 = P2;
while( j < i -1 +k )
{
if (P3->next == NULL)
{
printf("k is Error!\n");
return 0;
}
P3 = P3->next;
j++;
}
PLink = P3;//PLink返回main的值不正确
while( P1 != P3 )
{
P4 = P1;
P1 = P1->next;
free(P4);
}
}
else
{
while(P2 && j < i-2 )
{
if (P2->next == NULL)
{
printf("i is Error!\n");
return 0;
}
P2 = P2->next;
j++;
}
P1 = P2->next;
P3 = P2;
while( j < i -1 + k )
{
if (P3->next == NULL)
{
printf("k is Error!\n");
return 0;
}
P3 = P3->next;
j++;
}
P2->next = P3;//将剩下两段相连

while( P1 != P3 )
{
P4 = P1;
P1 = P1->next;
free(P4);
}
}
return 1;
}

int main(void)
{
int i, k, x;
LinkList PLink;
LinkList P, Pt;

PLink = P = init_link();
printf("Enter data(end of -1): ");
while(P != NULL)
{
scanf("%d", &x);
if (x == -1)
{
Pt->next = NULL;
break;
}
else
{
P->data = x;
P->next = (LinkList)malloc(sizeof(LNode));
if (P->next == NULL)
{
printf("内存分配失败!\n");
return 0;
}
Pt = P;
P = P->next;
}
}
printf("Enter i and k(i>0, k>0): ");
scanf("%d%d", &i, &k);
while(i < 1 || k < 1)
{
printf("i or k is Error! \nEnter again(i>0, k>0):");
scanf("%d%d", &i, &k);
}
if (delete_link(PLink, i, k) == 1)//如果i==1,则PLink的值就变了,不正确
{
while(PLink != NULL)
{
printf(" %d ", PLink->data );
PLink = PLink->next;
}
}
else
printf("Delete Error!\n");
printf("\n");

return 0;
}
...全文
519 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
eion 2011-03-20
  • 打赏
  • 举报
回复
函数申明
int delete_link(LinkList PLink, int i, int k)
决定了你在函数内不可能改变PLink的值,
修改的方法有两个:
其一:用返回值带出修改后的头指针值
// 返回修改后的头指针值
LinkList delete_link(LinkList PLink, int i, int k)
{
....
if (i==1) {
....
return PLink;
}
....
}
对应的主函数也要跟着修改

其二是用指向指针的指针
int delete_link(LinkList *ppLink, int i, int k)
{
// 原函数内所有的 PLink 都改写成 (*ppLink) 即可带出参数
}

顺便指出:
你的P1, P2, P3, P4变量定义得太低级了,一会儿就忘了谁是谁了,你可以用
pi, pi_1, pk来定义,或
pi, pre_pi, pk来定义,这样会减少很多错误
LouisQ007 2011-03-20
  • 打赏
  • 举报
回复
谢谢楼上!

33,008

社区成员

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

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