2024.6.1 数据结构_单链表

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

运行结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值