简单的顺序链表

该篇文章提供了一组C语言函数,用于操作链表,包括创建链表、判断链表是否为空、显示链表、获取链表长度、头插入、按位置插入、按位置删除、按位置查找值、按位置更改值等。示例代码展示了如何使用这些函数创建一个链表并进行一系列操作。
摘要由CSDN通过智能技术生成
#include <stdio.h>
#include <stdlib.h>
//01定义节点
typedef int data_t;
typedef struct Node{
	data_t data;
	struct Node* next;
}linklist;
//02节点的初始化以及创建
linklist* create_linklist()
{
	 linklist* head = (linklist*) malloc(sizeof(linklist));//创建头节点
	 head->data = -1;
	 head->next = NULL;
	 return head; 
 } 
 //03判断是不是空
 int linklist_is_empty(linklist* head)
 {
 	if(NULL == head)
 	{
	    printf("开辟空间失败\n"); 
	    return -1; 
	}
	if(head->next == NULL)
	{ 
		printf("表目前为空");
		return 1; 
	}
	else
	{
		return -1;
	}
	
 }
 //04打印表
 void show_linklist(linklist* head) 
 {
 	if(NULL == head)
 	{
 		printf("开辟空间失败\n"); 
 		return ;
	}
	if(linklist_is_empty(head) == 1)
	{
		printf("表为空,无法打印\n");
		return ;
	}
	linklist* p = head->next;
	while(p != NULL)
	{
		printf("%-3d",p->data);
		p = p->next;
	}
	printf("\n");
 }
 //05求表长
 int get_length_linklist(linklist* head)
 {	
    if(NULL == head)
 	{
 	    printf("开辟空间失败\n"); 
 		return -1;
	}
	int len = 0;
	linklist* p = head->next;
	while(p != NULL)
	{
		p = p->next;
		len++; 
	}
	return len;
  } 
 //06头插入
 int insert_by_head(linklist* head,data_t value)
 {
 	if(NULL == head)
 	{
 	    printf("开辟空间失败\n"); 
 		return -1;
	}
	linklist* ne_w = (linklist*) malloc(sizeof(linklist));
	ne_w->data = value;
	
	ne_w->next = head->next;
	head->next = ne_w;
	return 0;
	
 }
 //07按位置插入
 int insert_by_pos_linklist(linklist* head,int pos,int value)
 {
 	if(NULL == head)
 	{
 		printf("开辟空间失败\n"); 
 		return -1;
	}
	int len = 0;
	len = get_length_linklist(head);
	//判断位置合法性
	if(pos < 0||pos > len){
		return -1; 
	}
	//定义p指针 和new节点 
	linklist* p = head;
	linklist *ne_w = (linklist *)malloc(sizeof(linklist));
	ne_w->data = value;
	ne_w->next = NULL;
	//遍历到pos -1的位置 
	while(pos--)
	{
		p = p->next;
	}
	//开始插入
	ne_w->next = p->next;
	p->next = ne_w;
	return 0; 
	 
 } 
 //08按位置删
 int del_by_pos_linklist(linklist* head,data_t pos)
 {
 	if(NULL == head) return -1;
 	int len = get_length_linklist(head);
 	//判断位置合法性
	 if(pos < 0 || pos > len-1 )  return -1;
	 //准备p指针
	 
	 linklist* p = head;
	 while(pos--)
	 {
	 	p = p->next; 
	  } 
	  //准备指针q备份删除的pos节点 
	linklist* q = p->next;
	//将pos+1的节点 接到p的后边
	 p->next = q->next;
	 //删除pos节点
	 free(q);
	 q = NULL;
	 return 0; 
} 
//09按位置查值 
int find_by_pos(linklist* head,int pos)
{
	//判断head
    if(NULL == head) return -1;
    //判断位置合法性
    int len = get_length_linklist(head);
    if(pos <0 || pos >len-1)return -1;  //pos : 0-len-1
    //准备p指针遍历到pos-1位置
	linklist* p = head->next;
	while(pos--)
	{
		p = p->next;
	 } 
	 //返回值
	 return p->data; 
}
//10按位置改值
int change_by_pos(linklist* head,int pos,data_t newval)
{
	//1、判断head
    if(NULL == head) return -1;
    //2、判断位置合法性
    int len = get_length_linklist(head);
    if(pos <0 || pos >len-1) return -1;  //pos : 0-len-1
    //3、准备指针遍历到pos处
	linklist* p = head->next;
	while(pos--)
	{
		p = p->next;	
	} 
	//改值
	p->data = newval;
	return 0; 
	
 } 

//主函数
 int main()
 {
 	//02
 	linklist* head = create_linklist();
 	if(NULL == head)
 	{ 
 		return -1;
	}
	int n = 5,i = 0;
	for(i = 0;i<n;i++)
	{
		//06
		insert_by_head(head,i+1);	
	}
	//04
	show_linklist(head);
	//05
	int len = get_length_linklist(head);
	printf("表长为:%d\n",len);
	//07
	printf("2的位置插入2\n"); 
	insert_by_pos_linklist(head,2,2);
	show_linklist(head);
	//08
	printf("删除2位置的值\n"); 
	del_by_pos_linklist(head,2);
	show_linklist(head);
	//09
	printf("查2位置的值:\n");
	int num = find_by_pos(head,2);
	printf("%d\n",num);
	//10
	printf("改2位置的值为5:\n");
	change_by_pos(head,2,5);
	show_linklist(head);
	
 	return 0;
 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值