一、函数声明部分
cpp
复制代码
#ifndef __LINK_H__
#define __LINK_H__
#include <myhead.h>
typedef struct Link1
{
union{
int len;//用于头结点,统计节点个数
int data;//用于正常节点,存储数据
};
struct Link1 *next;//指针域
}Link,*Plink;
/**********函数声明**********/
//1.创建头结点
Plink create();
//1.1头插法
int front_insert(Plink l, int m);
//1.2尾插法
int last_insert(Plink l, int m);
//2.输出
void output_link(Plink l);
//3.任意位置插入一个节点
void anywhere_insert(Plink l, int pos, int m);
//4.任意位置删除一个节点
void anywhere_delete(Plink l, int pos);
//5.任意位置查找一个节点
void anywhere_search(Plink l, int pos);
//6.任意位置修改一个节点
void anywhere_rebuild(Plink l, int pos, int m);
#endif
二、函数(功能)实现部分
1、创建头节点
cpp
复制代码
//创建头结点
Plink create()
{
Plink p = malloc(sizeof(Link));
if(p == NULL){
printf("申请头结点失败!");
return NULL;
}
p->len = 0;
p->next = NULL;
return p;
}
2、头插法插入节点
cpp
复制代码
//头插法
int front_insert(Plink l , int m)
{
if(NULL == l){
printf("单链表不存在!\n");
return -1;
}
Plink p = malloc(sizeof(Link));
p->data = m;//把数据存入新节点
p->next = l->next; //新节点指向旧的第一个节点
l->next = p; //头结点指向新节点
l->len++; //节点个数+1
return 0;
}
3、尾插法插入节点
cpp
复制代码
//尾插法
int last_insert(Plink l, int m)
{
if(NULL == l){
printf("单链表不存在!\n");
return -1;
}
Plink t = l;
for(int i=0; i<l->len; i++){
t = t->next;
}
Plink p = malloc(sizeof(Link));
p->data = m; //把数据存入新节点
t->next = p; //最后一个节点指向新节点
p->next = NULL; //新节点指向空
l->len++; //节点个数+1
return 0;
}
4、遍历输出
cpp
复制代码
//输出
void output_link(Plink l)
{
Plink t = l;
for(int i=0; i<l->len; i++){ //循环len次
t = t->next;
printf("%d\t",t->data); //数据域
}
printf("\n");
}
5、任意位置插入一个节点
cpp
复制代码
//3.任意位置插入一个节点
void anywhere_insert(Plink l, int pos, int m)
{
if(NULL == l || pos<1 || pos>l->len+1){
printf("插入失败!\n");
return;
}
Plink t = l;
for(int i=1; i<pos; i++){
t = t->next;
}
Plink p = malloc(sizeof(Link));
p->data = m;
p->next = t->next;
t->next = p;
l->len++;
}
6、任意位置删除一个节点
cpp
复制代码
//4.任意位置删除一个节点
void anywhere_delete(Plink l, int pos)
{
if(NULL == l || pos<1 || pos>l->len){
printf("不允许删除!\n");
return;
}
Plink t = l;
for(int i=1; i<pos; i++){
t = t->next;
}
Plink q = t->next; //保留要删除的节点
t->next = t->next->next; //删除链接
l->len--;
free(q); //删除后释放
q = NULL; //置空
}
7、任意位置查找一个节点
cpp
复制代码
//5.任意位置查找一个节点
void anywhere_search(Plink l, int pos)
{
if(NULL == l || pos<1 || pos>l->len){
printf("查找失败!\n");
return;
}
Plink t = l;
for(int i=1; i<=pos; i++){
t = t->next;
}
printf("第%d个节点的数据是:%d\n",pos, (t->data) );
}
8、任意位置修改一个节点
cpp
复制代码
//6.任意位置修改一个节点
void anywhere_rebuild(Plink l, int pos, int m)
{
if(NULL==l || pos<1 || pos>l->len){
printf("修改失败!\n");
return;
}
Plink t = l;
for(int i=1; i<=pos; i++){
t = t->next;
}
t->data = m;
}
三、主函数部分
cpp
复制代码
#include"link.h"
int main(int argc, const char *argv[])
{
int a[10]={0,1,2,3,4,5,6,7,8,9};
//1.创建头结点
Plink l = create();
//1.1头插法
for(int i=0; i<10; i++){
front_insert(l, a[i]);
}
output_link(l);
//1.2尾插法
for(int i=0; i<10; i++){
last_insert(l, a[i]);
}
output_link(l);
//3.任意位置插入一个节点
anywhere_insert(l, 5, 666);
output_link(l);
//4.任意位置删除一个节点
anywhere_delete(l, 8);
output_link(l);
//5.任意位置查找一个节点
anywhere_search(l, 10);
//6.任意位置修改一个节点
anywhere_rebuild(l ,2, 999);
output_link(l);
free(l); //释放内存
l = NULL; //置空
return 0;
}