为了降低难度采用带头结点的单链表来实现。
接下来介绍主要步骤
1.单链表的创建
typedef struct Node
{
char data;//数据域
struct Node* next;//指针域
}Test;
2.链表的初始化
Test* p = (Test*)malloc(sizeof(Test*)); //p指向的节点为第一个数据节点 Test* head=(Test*)malloc(sizeof(Test*));//head指向的节点为头结点 head->next=p;//连接头结点和第一个数据节点
3.数据的存储以及打印
Test* s = p;//这里为了不改变p指向的位置 用了新的指针 因为后面删除操作和插入操作都要用到p
for (i = 0; i < 26; i++)
{
p->data = 'a' + i; //存储数据
p->next =(structNode*)malloc(sizeof(struct Node*)); //为下一个节点开启空间
p = p->next; //使形成链式结构
}
p->next = NULL;//将链表最后一个节点指针域置为空
while (s->next!=NULL)
{ printf("%c",s->data);
s = s ->next;
}//实现打印
4.任意位置删除操作的实现
void dle(struct Node* head, struct Node* p)//指向删除点前后的两个指针作为参数
{
int n; printf("删除几号位?n");
scanf("%d", &n);
getchar();
Test* k = head;
Test* g = p;
for (int i = 1; i < n; i++)
{
k = k->next;
g = g->next;
}//移动两个指针
k->next=g->next;//实现删除
}
5.任意位置插入操作的实现
void Insert(struct Node* head,struct Node* p )//指向插入点前后位置的两个指针为参数
{
int n;
printf("插入到几号位?n");
scanf("%d", & n);
printf("请输入要插入的字符n");
getchar();//吞前面的回车
char val = getchar();
Test* m = (structNode*)malloc(sizeof(struct Node));//为要插入的节点申请空间
m->data = val;//插入的数据
Test* k = head;
Test* g = p;//还是为了不改变head和p的指向
for (int i = 1; i < n; i++)
{
k=k->next;
g = g->next;
}//移动指针
m->next=k->next;
k->next = m;//实现插入
}
总结
难点主要在于:
1.把特殊位置的操作和一般位置的操作都用同一个函数实现
2.用循环使指针移动从而实现任意位置的插入 这里用的是传两个指针的方法
至于插入 删除的核心语句 画个图都是很好理解的
缺陷分析
1.这里并未实现连续的插入或删除操作
2.个人也还没有想到用不带头结点的链表来实现
3.这个实验的插入删除操作比较简单,因为事先已经存好了数据 ,并且我们也清楚知道各个节点的情况 。因此很多操作不用做一些判断 实际遇到的问题可能比这复杂得多。
**ps:**作为初学者写这篇博客主要是为了记录自己的学习日常同时很希望能得到大家的指点。这是我写的第一篇博客也希望自己能坚持下去。加油加油加油!!!



