33,008
社区成员
发帖
与我相关
我的任务
分享
/*已知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;
}