题目描述
输入一系列字符以-#作为结束标志,用尾插法创建链表并存储数据,然后在指定位置删除一个字符,并输出结果
输入
第一行输入一一个字符串,以#结束
一个整数pos
abcde#
2
输出
链表所有数据(删除前、删除后)各占一行
a b c d e
a c d e
#include"stdio.h"
#include"stdlib.h"
typedef struct node{
char data; // 节点数据类型为字符
struct node *next;
}Node;
// 创建链表函数
void creatList(Node * head);
// 根据位置删除节点函数,返回 1 表示成功,0 表示失败
int delByPos(Node *h,int pos);
// 输出链表函数
void output(Node *h);
// 销毁链表函数
void destroyList(Node *h);
main()
{
Node *head=(Node *)malloc(sizeof(Node)); // 创建头结点,不存放有效数据
head->next=NULL;
int pos;
// 尾插法创建链表
creatList( head);
// 输出链表
output(head);
// 输入删除数据信息
scanf("%d",&pos);
// 删除数据,成功则再输出链表,失败则报错
if(delByPos(head,pos))
output(head);
else
printf("delete by pos failed!\n");
// 销毁链表
destroyList(head);
}
/**
* 创建链表函数
* @param head 头指针
*/
void creatList(Node * head)
{
Node *tail = head; // 初始化尾指针为头结点
char ch;
while (scanf("%c", &ch) && ch!= '#') { // 不断读取字符直到遇到 '#'
Node *newNode = (Node *)malloc(sizeof(Node)); // 创建新节点
newNode->data = ch; // 设置新节点数据
newNode->next = NULL; // 新节点下一个指针为空
tail->next = newNode; // 将尾节点的下一个指向新节点
tail = newNode; // 更新尾节点为新节点
}
}
/**
* 根据位置删除节点函数
* @param h 链表头指针
* @param pos 要删除的位置
* @return 成功返回 1,失败返回 0
*/
int delByPos(Node *h,int pos)
{
Node *p = h; // 从链表头开始
int i = 0;
while (p && i < pos - 1) { // 找到要删除节点的前一个节点
p = p->next;
i++;
}
if (p && p->next) { // 如果存在该节点且它有下一个节点
Node *tmp = p->next; // 保存要删除的节点
p->next = tmp->next; // 将前一个节点的下一个指向要删除节点的下一个
free(tmp); // 释放要删除的节点
return 1; // 返回成功
}
return 0; // 返回失败
}
/**
* 输出链表函数
* @param h 链表头指针
*/
void output(Node *h)
{
Node *p = h->next; // 从第一个有效节点开始
while (p) { // 遍历链表
printf("%c ", p->data); // 输出节点数据
p = p->next; // 移动到下一个节点
}
printf("\n");
}
/**
* 销毁链表函数
* @param h 链表头指针
*/
void destroyList(Node *h)
{
Node *p = h->next; // 从第一个有效节点开始
while (p) { // 不断循环
Node *tmp = p; // 保存当前节点
p = p->next; // 移动到下一个节点
free(tmp); // 释放当前节点
}
free(h); // 最后释放头节点
}