![]() |
#2
wmf20142020-02-15 23:16
主要是对你的Node_Delect函数进行了修改,你的函数有几处明显的错误:
1:while(ptr_4->text!=text_h&&ptr_3->text!=text_l&&ptr_4->next!=NULL)开始循环时,ptr_3和ptr_4未初始化,调试时报错 2:显然你没有考虑到删除的字符在链表头部时的情况 3:你不能显式认为每次删除的是两个字符,如果是中英文混合的情况时,删除一个英文字符你将怎么处理? 4:我的编译器不能很好地支持putch,我都改成printf了 修改后的代码及运行效果如下: ![]() #include"STDIO.H" #include"STDLIB.H" #include"CONIO.H" #define Enter 0x0D struct Text { char text; struct Text *next; }; typedef struct Text Text; Text *HEAD; Text *Link_Build(); void Link_Output(Text *Head); Text *Node_Delect(Text *Head); void Link_Delect(Text *Head); void main() { HEAD = Link_Build(); printf("\n"); Link_Output(HEAD); HEAD=Node_Delect(HEAD); printf("\n"); Link_Output(HEAD); Link_Delect(HEAD); } Text *Link_Build() { Text *Head = NULL, *ptr_1, *ptr_2; ptr_1 = (Text *)malloc(sizeof(Text)); ptr_1->next = NULL; Head = ptr_1; ptr_2 = ptr_1; printf("\n请输入文字,并以Enter键结束:"); ptr_1->text = getch(); printf("%c",ptr_1->text); while (ptr_1->text != Enter) { ptr_1 = (Text *)malloc(sizeof(Text)); ptr_1->text = getch(); printf("%c", ptr_1->text); ptr_1->next = NULL; ptr_2->next = ptr_1; ptr_2 = ptr_1; } return(Head); } void Link_Output(Text *Head) { Text *ptr = Head; while (ptr != NULL) { printf("%c",ptr->text); ptr = ptr->next; } } Text *Node_Delect(Text *Head) { Text *ptr_1, *ptr_2 ; int i; char text[20]; printf("\n请输入要删除的文字:"); scanf("%s", text); for (i = 0; text[i]; i++) { for (ptr_1 = NULL, ptr_2 = Head; ptr_2&&text[i] != ptr_2->text; ptr_2 = ptr_2->next) ptr_1 = ptr_2; //只删除最先碰到的相同字 if (!ptr_1&&ptr_2)Head = ptr_2->next; //如果删除的字符在链表头部,则需要改变头指针 if (ptr_1&&ptr_2)ptr_1->next = ptr_2->next; //如果删除的字符在链表中部,则只需要改变上一个链表指向跳过要删除的位置 free(ptr_2); //释放删除的空间 } return Head; } void Link_Delect(Text *Head) { Text *ptr_1, *ptr_2 = Head; while (ptr_2 != NULL) { ptr_1 = ptr_2->next; free(ptr_2); ptr_2 = ptr_1; } printf("\n内容已删除!\n"); } 只有本站会员才能查看附件,请 登录 |
#include"STDIO.H"
#include"STDLIB.H"
#include"CONIO.H"
#define Enter 0x0D
struct Text
{
char text;
struct Text *next;
};
typedef struct Text Text;
Text *HEAD;
Text *Link_Build();
void Link_Output(Text *Head);
void Node_Delect(Text *Head);
void Link_Delect(Text *Head);
void main()
{
HEAD=Link_Build();
putch('\n');
Link_Output(HEAD);
Node_Delect(HEAD);
putch('\n');
Link_Output(HEAD);
Link_Delect(HEAD);
}
Text *Link_Build()
{
Text *Head=NULL,*ptr_1,*ptr_2;
ptr_1=(Text *)malloc(sizeof(Text));
ptr_1->next=NULL;
Head=ptr_1;
ptr_2=ptr_1;
printf("\n请输入文字,并以Enter键结束:");
ptr_1->text=getch();
putch(ptr_1->text);
while(ptr_1->text!=Enter)
{
ptr_1=(Text *)malloc(sizeof(Text));
ptr_1->text=getch();
putch(ptr_1->text);
ptr_1->next=NULL;
ptr_2->next=ptr_1;
ptr_2=ptr_1;
}
return(Head);
}
void Link_Output(Text *Head)
{
Text *ptr=Head;
while(ptr!=NULL)
{
putch(ptr->text);
ptr=ptr->next;
}
}
void Node_Delect(Text *Head)
{
Text *ptr_1,*ptr_2=Head,*ptr_3,*ptr_4;
char text_h,text_l;
char Flag=0;
printf("\n请输入要删除的文字:");
text_l=getch();
text_h=getch();
putch(text_l);
putch(text_h);
putch('\n');
while(ptr_4->text!=text_h&&ptr_3->text!=text_l&&ptr_4->next!=NULL)
{
ptr_1=ptr_2;
ptr_2=ptr_1->next;
if(ptr_2->text==text_h&&ptr_1->text==text_l)
{
Flag=1;
break;
}
else
{
ptr_3=ptr_2->next;
ptr_4=ptr_3->next;
}
}
if(Flag==1)
{
Head=ptr_3;
free(ptr_2);
free(ptr_1);
}
else if(ptr_4->next==NULL)
{
ptr_2->next=NULL;
free(ptr_4);
free(ptr_3);
}
else
{
ptr_1=ptr_4->next;
ptr_2=ptr_1->next;
free(ptr_4);
free(ptr_3);
}
}
void Link_Delect(Text *Head)
{
Text *ptr_1,*ptr_2=Head;
while(ptr_2!=NULL)
{
ptr_1=ptr_2->next;
free(ptr_2);
ptr_2=ptr_1;
}
printf("\n内容已删除!\n");
}
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录