2024/2/20

本文详细介绍了如何使用C语言实现链表的基本操作,包括头插法(toucha_linklist)、尾插法(weicha_linklist)、首尾删除(toushan_linklist,weishan_linklist)、按位置插入(wzcr_linklist)、按位置删除(wzsc_linklist)以及直接插入排序(charupaixu_linklist)。还展示了链表的遍历(bl_linklist)。
摘要由CSDN通过智能技术生成

链表 

#include <stdio.h>
#include "./03_linklist.h"
int main(int argc, const char *argv[])
{
	Linklist* head =cj_linklist();
	toucha_linklist(head,80);
	toucha_linklist(head,27);
	toucha_linklist(head,59);
	toucha_linklist(head,18);
	bl_linklist(head);

	weicha_linklist(head,800);
	weicha_linklist(head,270);
	weicha_linklist(head,590);
	weicha_linklist(head,180);
	bl_linklist(head);

	toushan_linklist(head); 
	bl_linklist(head);

	weishan_linklist(head);
	bl_linklist(head);

	wzcr_linklist(head,1,2718);
	bl_linklist(head);

	wzsc_linklist(head,1);
	bl_linklist(head);

	printf("--------------------------------------\n");
	Linklist* temp =cj_linklist();
	charupaixu_linklist(temp,27);
	charupaixu_linklist(temp,18);
	charupaixu_linklist(temp,59);
	charupaixu_linklist(temp,69);
	charupaixu_linklist(temp,80);
	bl_linklist(temp);

	return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include "./03_linklist.h" 
Linklist* cj_linklist(void)
{
	Linklist* head = malloc(sizeof(Linklist));//创建带头结点的单链表
	if(head == NULL )
	{
		printf("头结点申请失败,创建单链表失败\n");
		return NULL;

	}
	head->text.len = 0;
	head->next = NULL;
	return head;
}

int toucha_linklist(Linklist* head ,Datatype num)//头插法插入数据
{

	Linklist* temp = (Linklist* )malloc(sizeof(Linklist));//创建新的节点
	if(NULL ==temp)
	{
		printf("头插失败\n");
		return -1;
	}
	temp->text.data = num;
	temp->next = NULL;
	temp->next = head->next;
	head->next = temp;
	head->text.len++;
	return 0;
}

int weicha_linklist(Linklist* head,Datatype num)//尾插法插入数据
{


	Linklist* temp = (Linklist* )malloc(sizeof(Linklist));//创建新的节点
	if(NULL ==temp)
	{
		printf("尾插失败\n");
		return -1;
	}
	temp->next = NULL;
	temp->text.data  = num;
	Linklist *p = head;
	while(p->next != NULL)
	{
		p = p->next;
	}
	p->next = temp;
	temp->next = NULL;

}
int pankong_linklist(Linklist* head)//判空
{
	return head->next == NULL?1:0;
}

int toushan_linklist(Linklist* head )//头删法删除数据 
{
	if(pankong_linklist(head))
	{
		printf("头删失败,链表为空\n");
		return(Datatype)-1;
	}

	Linklist* temp = head->next;
	head->next = head->next->next;
	free(temp);
	temp = NULL;
	head->text.len--;

}

Datatype weishan_linklist(Linklist* head)
{
	if(pankong_linklist(head))
	{
		printf("链表为空,尾删失败\n");
		return (Datatype)-1;
	}
	Linklist* temp = head;
	while(temp->next->next !=NULL)
	{
		temp = temp->next;
	}
	free(temp->next);
	temp->next = NULL;
	head->text.len;
}

void wzcr_linklist(Linklist* head, int pos, Datatype num)//按位置插入
{
	if( pos<1 || pos> head->text.len)
	{
		printf("插入位置非法\n");
	}

	int i;
	Linklist* p = head;
	for(i=0;i<pos-1;i++)
	{
		p = p->next;
	}
	Linklist* temp = (Linklist* )malloc(sizeof(Linklist));
	if(temp == NULL)
	{
		printf("插入失败,链表为空\n");
	}
	temp->text.data = num;
	temp->next = NULL;
	temp->next = p->next;
	p->next = temp;
	head->text.len++;


}

Datatype wzsc_linklist(Linklist* head, int pos)//按位置删除
{
	if(pankong_linklist(head))
	{

		printf("链表为空\n");

	}
	if( pos<1 || pos> head->text.len)
	{
		printf("删除位置非法\n");
		return (Datatype)-1;
	}
	Linklist* p;
	int i;
	for(i=0;i<pos-1;i++)
	{
		p = p->next;
	}
	Linklist* temp = p->next;
	p->next = temp->next;
	Datatype num = head->text.data;
	free(temp);
	temp = NULL;
	head->text.len--;
	return num;

}


void charupaixu_linklist(Linklist* head,Datatype num)//直接插入排序
{

	Linklist* temp = (Linklist*)malloc(sizeof(Linklist));//创建带头结点的单链表
	if(temp == NULL )
	{
		printf("头结点申请失败,创建单链表失败\n");
		return ;

	}
	temp->text.data = num;
	temp->next = NULL;
	Linklist*p = head;
	while(p->next != NULL)
	{
		if(p->next->text.data > temp->text.data )

			break;

		else
		{
			p = p->next;
		}
	}
	temp->next = p->next;
	p->next = temp;
	(head->text.len)++;
	return;
	

}
void bl_linklist(Linklist* head)//遍历链表
{
	Linklist* p = head;
	while(p->next != NULL)
	{
		p = p->next;
		printf("%d ", p->text.data);

	}
	putchar(10);
	return;

}



#ifndef  __LINKLIST_H__
#define __LINKLIST_H__
typedef int Datatype;
union msg
{
	Datatype data;
	int len;
};
typedef struct node
{
	union msg text;
	struct node* next;
}Linklist;
Linklist* cj_linklist(void);
int toucha_linklist(Linklist* head, Datatype num);
void bl_linklist(Linklist* head);
int weicha_linklist(Linklist* head,Datatype num);
int toushan_linklist(Linklist* head); 
void bl_linklist(Linklist* head);
Datatype weishan_linklist(Linklist* head);
void wzcr_linklist(Linklist* head, int pos, Datatype num);
Datatype wzsc_linklist(Linklist* head, int pos);
void charupaixu_linklist(Linklist* head,Datatype num);
#endif

makefile

 -include ./makefile.cfg
 
 $(Target):$(Obj)   
 
     $(CC) $^ -o $@
 
 %.o:%.c 
 
     $(CC) $< $(CAN) $@
 
 .PHONY:clean        
 
 clean:
     rm $(Obj)
 
                           
 Target:=a.out
 Obj:=01_main.o 02_linklist.o
 
 CAN:=-c -o
 CC:=gcc                        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值