1.功能函数代码
#include <stdio.h>
#include <stdlib.h>
#include "./_data.h"
/*
* function: 创建链表的头结点
* @param [ in]
* @param [out]
* @return
*/
link_list* create_link_list(void)
{
link_list* head = (link_list*)malloc(sizeof(link_list));
if(head==NULL)
{
printf("申请空间失败\n");
return NULL;
}
head->gcf.len = 0;
head->next=NULL;
printf("头结点申请成功\n");
return head;
}
/*
* function: 单链表头插
* @param [ in]
* @param [out]
* @return
*/
void insert_top_link_list(link_list* head,user_type data)
{
link_list* temp = (link_list*)malloc(sizeof(link_list));
temp->next = head->next;
head->next = temp;
temp->gcf.data = data;
head->gcf.len++;
}
/*
* function: 单链表尾插
* @param [ in]
* @param [out]
* @return
*/
void insert_bottom_link_list(link_list* head,user_type data)
{
link_list* temp = (link_list*)malloc(sizeof(link_list));
link_list* p = head;
while(p->next != NULL)
{
p=p->next;
}
temp->next=NULL;
p->next=temp;
temp->gcf.data=data;
head->gcf.len++;
}
/*
* function: 单链表头删
* @param [ in]
* @param [out]
* @return
*/
void delete_top_link_list(link_list* head)
{
if(head->next==NULL)
{
printf("单链表空空如也\n");
return;
}
link_list* p = head;
link_list* temp = p->next;
p->next = temp->next;
free(temp);
p->gcf.len--;
}
/*
* function: 单链表尾删
* @param [ in]
* @param [out]
* @return
*/
void delete_bottom_link_list(link_list * head)
{
if(head->next==NULL)
{
printf("单链表空空如也\n");
return;
}
link_list* p = head;
for(;p->next->next!=NULL;p=p->next);//找到倒数第二个的位置
link_list* temp = p->next;
p->next=p->next->next;
free(temp);
head->gcf.len--;
}
/*
* function: 位置插入
* @param [ in]
* @param [out]
* @return
*/
void insert_index_link_list(link_list* head,int index,user_type data)
{
if(index<=0 || index>head->gcf.len+1)//针对头结点存放有单链表总长度的做法
{
printf("插入位置不合法\n");
return;
}
link_list* p = head;
link_list* temp = (link_list*)malloc(sizeof(link_list));
for(int i=1;i<index;i++,p=p->next);//找到插入位置的前一个节点
temp->gcf.data=data;
temp->next=p->next;
p->next=temp;
head->gcf.len++;
}
/*
* function: 打印单链表
* @param [ in]
* @param [out]
* @return
*/
void put_list_link(link_list* head)
{
link_list* p=head;
if(p->next==NULL)
{
printf("单链表空空如也\n");
return;
}
while(p->next!=NULL)
{
p=p->next;
printf("%d ",p->gcf.data);
}
printf("\tlen=%d\n",head->gcf.len);
}
/*
* function: 位置删除
* @param [ in]
* @param [out]
* @return
*/
void delete_index_link_list(link_list* head,int index)
{
if(head->next==NULL)
{
printf("单链表空空如也\n");
return;
}
if(index<=0 || index>head->gcf.len)
{
printf("删除位置不合法\n");
return;
}
link_list* p = head;
for(int i=1;i<index;i++,p=p->next);//找到删除位置的前一个节点
link_list* temp = p->next;//把删除位置前一个节点的指针域中的地址另存一下,方便后续释放空间
p->next = p->next->next;
free(temp);
head->gcf.len--;
}
/*
* function: 释放堆空间
* @param [ in]
* @param [out]
* @return
*/
void free_link_list(link_list* head)
{
link_list * p = head;
link_list* temp = p->next;
free(head);
while(temp->next != NULL)
{
free(temp);
temp=temp->next;
}
printf("释放成功\n");
}
2.头文件代码
#ifndef __data_h__
#define __data_h__
typedef int user_type;
typedef struct link
{
union
{
int len;
user_type data;
}gcf; //数据域
struct link* next; //指针域
}link_list;
link_list* create_link_list(void);//创建单链表表头
void insert_top_link_list(link_list* head,user_type data);//头插
void insert_bottom_link_list(link_list* head,user_type data);//尾插
void delete_top_link_list(link_list* head);//头删
void delete_bottom_link_list(link_list * head);//尾删
void insert_index_link_list(link_list* head,int index,user_type data);//位置插入
void delete_index_link_list(link_list* head,int index);//位置删除
void put_list_link(link_list* head);//遍历打印
void free_link_list(link_list*);
#endif
3.主函数代码
#include <stdio.h>
#include "./_data.h"
int main(int argc, const char *argv[])
{
link_list* head = create_link_list();
insert_index_link_list(head,0,0);
put_list_link(head);
insert_index_link_list(head,1,10);
put_list_link(head);
insert_index_link_list(head,2,20);
put_list_link(head);
insert_index_link_list(head,3,30);
put_list_link(head);
insert_index_link_list(head,4,40);
put_list_link(head);
insert_index_link_list(head,5,10);
put_list_link(head);
insert_index_link_list(head,7,10);
put_list_link(head);
printf("\n\n----------------------我是分割线-----------------------------\n\n");
delete_index_link_list(head,1);
put_list_link(head);
delete_index_link_list(head,0);
put_list_link(head);
delete_index_link_list(head,4);
put_list_link(head);
delete_index_link_list(head,4);
put_list_link(head);
free_link_list(head);
return 0;
}
4.makefile代码
-include ./makefile.cfg
$(putfile):$(file)
$(bianyiqi) $^ -o $@
%.o:%.c
$(bianyiqi) $^ $(canshu) $@
.PHONY:clean
clean:
rm $(file)
5.makefile.cfg代码
file=_main.o _data.o
putfile=a.out
bianyiqi=gcc
canshu=-c -o
运行结果