用带头结点的单链表表示链串,每个结点存放一个字符。设计一个算法,将链串s中所有值为x的字符删除。要求算法的时间复杂度均为O(n)、空间复杂度O(1).
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define Maxsize 100
typedef struct snode
{
char data;
struct snode*next;
}LinkStrNode;
void StrAssign(LinkStrNode*&s,char cstr[],int n)//生成串
{
int i;
LinkStrNode*r,*p;
s=(LinkStrNode*)malloc(sizeof(LinkStrNode));
r=s;
for(i=0;i<n;i++)
{
p=(LinkStrNode*)malloc(sizeof(LinkStrNode));
p->data=cstr[i];
r->next=p;r=p;
}
r->next=NULL;
}
void DestroyStr(LinkStrNode*&s)//销毁串
{
LinkStrNode*pre=s,*p=s->next;
while(p!=NULL)
{
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}
void DispStr(LinkStrNode*s)//输出串
{
LinkStrNode*p=s->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
LinkStrNode *DelStr(LinkStrNode*s)
{
LinkStrNode*str,*p=s->next,*q,*r;int k=0;
str=(LinkStrNode*)malloc(sizeof(LinkStrNode));
str->next=NULL;
r=str;
while(p!=NULL)
{
if(p->data=='x')
{
p=p->next;
/*q=(LinkStrNode*)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;
r=q;k++;*/
}
else
{
q=(LinkStrNode*)malloc(sizeof(LinkStrNode));
q->data=p->data;
r->next=q;
r=q;
p=p->next;
}
}
r->next=NULL;
DispStr(str);
return str;
}
int main(){
LinkStrNode*s;char cstr[Maxsize];
int i,n;
printf("有多少个字符?");
scanf("%d",&n);fflush(stdin);
printf("请输%d个字符:",n);
for(i=0;i<n;i++)
{
scanf("%c",&cstr[i]);
}
StrAssign(s,cstr,n);DispStr(s);
DelStr(s);
return 0;
}