一、添加新结点
代码如下:
#include<stdio.h>
#include<stdlib.h>
struct link* create(int n) //声明创建结点函数
{
struct link* headnode, * node; //创建头指针和结点指针
headnode = (struct link*)malloc(sizeof(struct link)); //为headnode申请内存空间
headnode->next = NULL; //只有头结点时,其指针域指向NULL(即指向空)
for (int i = 0; i < n; i++) //利用for循环给链表添加数据域
{
node = (struct link*)malloc(sizeof(struct link)); //为node申请内存空间(node成为新建结点)
scanf("%d", &node->data); //scanf接受客户端的值,为node的数据域赋值
node->next = headnode->next; //插入新节点前,headnode的指针域指向NULL(因为只有headnode结点)
//插入后,新建结点作为尾结点,其指针域要指向NULL,所以node->next= headnode->next(==NULL)
headnode->next = node; //插入后,新建结点node已经有指向了,此时它的前一位结点headnode会指向node的地址
//即headnode->next = node
}
}
图解:
二、删除指定结点
代码如下:
void deletenode(struct stu *head,int n){ //删除n处的结点
struct stu *p=head,*pr=head; #定义p、pr指针,均指向head
int i=0;
while(i<n&&p!=NULL){ //当到达指定结点时,且p不指向空
pr=p; //将p的地址赋值给pr
p = p->next; //p指向下一个结点的地址
i++; //i+1,循环到p指向指定结点,pr指向指定结点的上一节点
}
if(p!=NULL){ //当p不为空时,即p不能指向尾结点之后的结点
pr->next = p->next;
free(p);
} else{
printf("节点不存在!\n");
}
}
三、插入结点
代码如下:
void insertnode(struct stu *head,int n){
struct stu *p = head,*pr; //插入结点,需通过定义两个新指针完成操作
pr = (struct stu*)malloc(sizeof(struct stu)); //申请一段内存空间,让pr指针指向该内存
printf("input data:\n");
scanf("%d%s",&pr->id,pr->name);
int i=0;
//当插入位置是尾结点时,只要在尾结点后再插入一个结点,并让尾结点的指针指向新建节点
while(i<n&&p!=NULL){ //使p指向将要插入结点的位置
p = p->next;
i++;
}
if(p!=NULL){
pr->next = p->next;
p->next = pr;
}else{
printf("节点不存在!\n");
}
}
图解:
3