链表结构体声明:
首先,在创建一个链表之前,我们要先创建一个链表单个节点的结构体,分别包含数据域和指针域,具体实现如下:
typedef struct node{
int data; //数据域
struct node *next; //指针域
}Node,*Link;
单链表的创建:
创建一个带有头结点的链表,虽然不是必须的,但是很方便。
Link create()
{
Link head = NULL;
head = (Link)malloc(sizeof(Node));
if(head == NULL)
{
printf("动态内存分配失败");
return NULL;
}
head->data = 0; //数据域赋初始值
head->next = NULL; //指针域赋初始值
return head;
}
单链表的插入:
头插法增加节点:(插入顺序为反向)
void head(Link head,int num)
{
Link p,pr;
p = head->next; //p为头结点的下一个
pr = NULL; //pr为新插入的结点 插在head后p前
pr = (Link)malloc(sizeof(Node));
if(pr == NULL)
{
printf("动态内存分配失败");
return ;
}
pr->data = num; //给pr数据域赋值
pr->next = p; //头插!
head->next = pr;
return ;
}
尾插法增加节点:(插入顺序为正向)
void rear(Link head,int num)
{
Link p = head;
Link pr = NULL; //pr为新增节点
pr = (Link)malloc(sizeof(Node));
if(pr == NULL)
{
printf("动态内存分配失败");
return ;
}
pr->data = num; //数据域赋值
if(head->next == NULL) //如果头结点下一个为空,就可以直接插入
{
head->next = pr; //插在头结点后一个
pr->next = NULL; //插完后就指向空结束了
}
else
{
while(p->next != NULL) //头节点不指向空,就先循环遍历链表找到最后一个再插进去
{
p = p->next;
}
p->next = pr; //尾插!
pr->next = NULL;
}
return;
}
单链表的删除:
void deletenode(Link head,int n) //传入链表和要删除的数
{
Link p = NULL,pr = NULL; //定义一前一后两个节点
p = head;
pr = head->next;
if(head == NULL)
{
printf("链表为空,没有可删除的值");
return ;
}
while(pr->data != n && pr->next != NULL) //没遍历到要删除的值,并且不指空,就接着遍历
{
p = pr; //删除操作,前保存后
pr = pr->next;
}
//出循环有两种情况:
//1.找到要删除的值了
//2.整个链表遍历到最后也没找到,
// 也就是说这个传入的要删除的值根本不存在链表当中
if(pr->data == n)
{
if(pr == head) //优先考虑,pr为头节点,直接给head保存,最后一起释放pr
{
head->next = pr->next;
}
else
{
p->next = pr->next //前面p保存后面pr,最后一起释放pr
}
free(pr);
printf("删除成功!");
}
else
{
printf("未找到要删除的值");
}
return ;
}
单链表的修改:
void fix(Link head,int m) //传入链表和要改动的值
{
Link pr;
pr = head->next;
int fixnum;
if(head == NULL)
{
printf("链表为空,无可删除的数据");
return ;
}
while(pr->next != NULL) //遍历整个链表
{
if(pr->data == m)
{
printf("请输入新值:");
scanf("%d",&fixnum);
pr->data = fixnum; //给pr数据域赋新的值
return; //修改完毕直接结束执行此函数
}
pr = pr->next; //没找到则一直遍历
}
printf("未找到可以修改的值"); //出循环还没找到就是这个值不存在
return;
}
单链表的查询:
void search(Link head,int x) //传入整个链表和要查询的值
{
Link p;
p = head;
if(head == NULL)
{
printf("链表为空,无可查询的数据");
return ;
}
p->data = x;
int searchnode;
printf("输入带查询的数:");
scanf("%d",&searchnode);
while(p->data != searchnode && p->next != NULL) //如果不是查询的值并且指向不为空,就进入循环遍历
{
p = p->next;
}
//出循环就是两种情况(和删除修改一样)
if(p->data == searchnode)
{
printf("查询结果:%d",searchnode);
return ; //找到直接退出函数执行
}
else
{
printf("未找到要查询的值");
}
return ;
}
链表的陈列(遍历):
void display(Link head)
{
Link pr = head->next;
while(pr != NULL) //注意陈列打印的条件
{
printf("%d\t",pr->data);
pr = pr->next;
}
return ;
}
链表的元素个数:
void displaynode(Link head)
{
Link pr = head->next;
int count = 0;
while(pr != NULL)
{
pr = pr->data;
cnt++;
}
printf("%d",count);
return ;
}