主要是为了帮助初学者,如果有不对的地方,还请大佬指出。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode {
char data;
struct LNode* next;
}LinkNode;//链表结构体的定义
/*链表有的人写有头节点的,有的人写无头节点的,都一样,推荐写头节点*/
/*创立单链表,分为头插法和尾插法*/
void Create(LinkNode* head)
{
char data;
LinkNode* s;
head->next = NULL;
printf("输入节点信息,输入#时结束\n");
scanf("%c", &data);
while (data != '#')
{
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = data;
s->next = head->next;
head->next = s;
scanf("%c", &data);
}
}
/*尾插法*/
void Create2(LinkNode* head)
{
char data;
LinkNode* s;
LinkNode* tail;//尾指针
tail = head;
printf("输入节点信息,输入#时结束\n");
scanf("%c", &data);
while (data != '#')
{
s = (LinkNode*)malloc(sizeof(LinkNode));
s->next = NULL;
s->data = data;
tail->next = s;
tail = s;
scanf("%c", &data);
}
tail->next = NULL;
}
/*全部删除,即销毁链表*/
void DestroyList(LinkNode *head)
{
LinkNode* pre = head->next,*p=head->next->next;
while (p != NULL)
{
free(pre);
pre = p;
p = p->next;
}
}
/*这里只写一种单个删除方式,按元素值删除,其它的其实差不了多少*/
void ListDelete(LinkNode* head, char aim)//这里的aim指的是将要删除的元素
{
LinkNode* pre = head, * p = head->next;
while (p!= NULL)
{
if (p->data == aim)
{
pre->next = p->next;
free(p);
p = pre->next;
}
else
{
pre = p;
p = p->next;
}
}
}
/*遍历链表*/
void DisList(LinkNode* head)
{
LinkNode* p = head->next;
while (p != NULL)
{
printf("%c", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
LinkNode head,head_2;
head.next = NULL; head.next = NULL;
Create(&head);
Create2(&head_2);//可以随便用其它字符,表示你要删除的字符
ListDelete(&head, 'a');
ListDelete(&head_2, 'a');
DisList(&head);
DisList(&head_2);
DestroyList(&head);
DestroyList(&head_2);
return 0;
}
此处是运行结果,我为了展示两种创建法就写了两个链表,因为链表信息是字符类型的,所以中间不要加回车(回车符是“/r”,表示当行这一特定部分已经结束);
!