一 单链表的创建
创建一个链表基本上由一下四部组成:
1 定义头指针
2 创建第一个结点,将头指针只想第一个结点
3 在创建一个结点,第一个结点尾部指向下一个结点
4 最后一个结点的指针域为空结点
程序的基本步骤为:
1 创建结构体,构造结点
struct Node
{ int data;
Node* next;
}
2使用堆内存创建一个节点
链表的存储比较灵活,一般由堆区来存储(一般由程序员分配释放, 若程序员不释放,程序结束时可能由操作系统回收.类似于链表,在内存中的分布不是连续的,它们是不同区域的内存块通过指针链接起来的.一旦某一节点从链中断开,我们要人为的把所断开的节点从内存中释放.不同区的比较和应用,参考博客:https://www.cnblogs.com/houjun/p/4909413.html)
基本的步骤是:
1 申请内存
2 查看是否申请成功
3 清理申请到的内存
4 填充结点数据及指针域
代码的实现:
其中 malloc 动态分配空间具体实现参考博客:https://www.cnblogs.com/ysys/p/6994091.html
*// 作用:创建一个链表节点
// 返回值:指针,指针指向我们本函数新创建的一个节点的首地址
struct node * create_node(int data)
{
struct node *p = (struct node *)malloc(sizeof(struct node));
if (NULL == p)
{
printf("malloc error.\n");
return NULL;
}
// 清理申请到的堆内存
bzero(p, sizeof(struct node));
// 填充节点
p->data = data;
p->pNext = NULL;
//将来用来指向下一个节点的首地址,这里没有下一个节点,故初始化为NULL
return p; //返回值,是刚创建的节点的首地址的指针**
3 构造一个链表
int main()
{
struct Node *pheader=Null;
pheader=creat_node(1);//将创建的头指针和上面的堆区创建的结点连接起来
}
二 在单链表的末尾添加结点
在尾部插入结点分为两步:
1 找到单链表的尾部;
2 将新的结点和原来的结点连接起来
插入结点的基本流程如下
代码的具体实现
//函数的两个参数分别是头指针,新的结点的首地址
void addtotail(struct Node *pheader, struct Node *new)
{
struct Node *pnode=pheader;
while(pnode!=NULL)
{
pnode=pnode->next;
}
pnode->next=new;
}
综合以上的代码,写出整个插入结点的程序:
int main()
{
struct Node *pheader=creat_node(1);
addtotail(pheader,creat_node(2));
return 0 ;
}
详细的请参考博客:https://blog.csdn.net/wangweijundeqq/article/details/79188813
三 在链表的头部插入结点
在尾部插入结点分为两步:
1 新的结点的next 指向原来第一个结点的首地址;
2 头节点指向新的结点的首地址;
这两个步骤是不可以交换的,如果断开,他不是连续的,那么原来的第一个结点的地址会丢失。所以应该先指向原来的首地址,放置丢失。
void addtoheader(struct Node *pheader,struct Node *new)
{
new->next=pheader—>next;
pheader->next=new;
pheader->data+=1;//一般的首结点的data存放的链表的个数,没执行一次插入加1.
}
综合以上的代码:
int main()
{
struct Node *pheader=creat_node(0);
addtoheader(pheader,creat_node(1));
addtotail(pheader,creat_node(2));
addtoheader(pheader,creat_node(3));
return 0 ;
}//输出链表为:3,1,2