C语言从控制台输入一个字符串存入数组,回车键结束,把数组转存到链表里面(每个节点一个字符)

并遍历该链表删除‘a’的节点,输出链表... 并遍历该链表删除‘a’的节点,输出链表 展开
 我来答
zhiyyao
2015-11-20 · TA获得超过1910个赞
知道小有建树答主
回答量:645
采纳率:57%
帮助的人:396万
展开全部
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LEN   sizeof (struct array)

struct array
{
char ch;
struct array *next;
};

int main()
{
struct array *deletea (struct array *h, char ch, int n); //删除字符'a'
void displist (struct array *head);  //显示链表中内容
char str[100];
int n = 0, i, len, count = 0, j = 0;
struct array *head, *p1, *p2;

printf ("输入字符串:\n");
gets (str);
for (i=0; i<strlen(str); i++)  //计算'a'的个数
if (str[i] == 'a')
count ++;
len = strlen (str);
p1 = p2 = (struct array *) malloc (LEN);
p1->ch = str[j++];
head = NULL;
while (len--)
{
n ++;
if (n == 1)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (struct array *) malloc (LEN);
p1->ch = str[j++];
}
p2->next = NULL;

printf ("删除链表中'a'的结点:\n");
head = deletea (head, 'a', count);
displist (head);
printf ("\n");

return 0;
}

struct array *deletea (struct array *h, char c, int n)
{
struct array *FindNode (struct array *h, char c);//返回要删除结点的上一个结点
struct array *p, *r;
int flag = 0;

if (h == NULL)
{
printf ("链表为空!\n");
return h;
}
if (h->ch == c)
{
p = h;
h = h->next;
free (p);
n --;
flag = 1;
}
r = FindNode (h, 'a'); 
if (r==NULL && !flag)
printf ("没有找到要删除的结点!\n");
else
while(n--)
{
r = FindNode (h, 'a');
p = r->next;
r->next = p->next;
free (p);
}


return h;
}

struct array *FindNode (struct array *h, char c)
{
struct array *p = h, *q;

while (p!=NULL && p->ch!=c)
{
q = p;
p = p -> next;
}
if (p == NULL)
return NULL;
else
return q;
}

void displist (struct array *head)
{
while (head != NULL)
{
putchar (head->ch);
head = head -> next;
}
}

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式