c语言下单链表的增删改查

 linklist.c //各个功能的函数


#include "linklist.h"

/* 功能: 申请头结点
 * 参数: 无
 * 返回值: 成功 头结点的首地址
 *		   失败 NULL
 * */
Link *create_linklist()  //创建头结点
{
	Link *ln = (Link *)malloc(sizeof(Link));
	if(NULL == ln)
		return NULL;
	bzero(ln,sizeof(Link));
	return ln;
}

Node *create_linknode(DT va)//创建节点
{
	Node *n = (Node *)malloc(sizeof(Node));
	if(NULL == n)
		return NULL;
	bzero(n,sizeof(Node));
	n->data = va;
	return n;
}

int push_front_linklist(Link *ln,DT va)
{
	Node *n = create_linknode(va);
	n->next = ln->head;
	ln->head = n;
	ln->count++;
	return 0;
}

int push_back_linklist(Link *ln,DT va)
{
	Node *n = create_linknode(va);
	if(empty_linklist(ln))
		ln->head = n;
	else
	{
		Node *tmp = ln->head;
		while(tmp->next)   //while(tmp->next!=NULL)
			tmp = tmp->next;
		tmp->next = n;
	}
	ln->count++;
	return 0;
}

int insert_pos_linklist(Link *ln,int pos,DT va)
{
	if(empty_linklist(ln))
		return -1;
	if(pos<=0 || pos>ln->count+1)
		return -2;
	if(pos==1)
		push_front_linklist(ln,va);
	else
	{
		Node *n = create_linknode(va);
		Node *tmp = ln->head;
		for(int i=1;i<pos-1;i++)
			tmp = tmp->next;
		n->next = tmp->next;
		tmp->next = n;
		ln->count++;
	}
	return 0;
}

int insert_val_linklist(Link *ln,DT old_va,DT new_va)
{
	if(empty_linklist(ln))
		return -1;
	Node *tmp=ln->head;
	while(tmp&&tmp->data!=old_va)
	{
		tmp=tmp->next;
	}
	if(tmp)
	{
		Node *n=create_linknode(new_va);
		n->next=tmp->next;
		tmp->next=n;
		ln->count++;
	}
	else
		return -2;

	return 0;
}

int pop_front_linklist(Link *ln)
{
	if(empty_linklist(ln))
		return -1;
	Node *tmp = ln->head;
	ln->head = tmp->next;
	free(tmp);
	ln->count--;
	return 0;
}

int pop_back_linklist(Link *ln)
{
	if(empty_linklist(ln))
		return -1;
	else if(ln->count==1)
	{
		free(ln->head);
		ln->head=NULL;
	}
	else
	{
		Node *tmp=ln->head;
		Node *tmp2=NULL;
		while(tmp->next)
		{
			tmp2=tmp;
			tmp = tmp->next;
		}
		free(tmp);
		tmp2->next=NULL;
	}
	ln->count--;
	return 0;
}

int delete_pos_linklist(Link *ln,int pos)
{
	if(empty_linklist(ln))
		return -1;
	if(pos<=0||pos>ln->count)
		return -2;
	if(pos==1)
		pop_front_linklist(ln);
	else
	{
		Node *tmp=ln->head;
		Node *pn=tmp->next;
		for(int i=1;i<pos-1;i++)
		{
			tmp=tmp->next;
			pn=pn->next;
		}
		tmp->next=pn->next;
		free(pn);
		ln->count--;
	}
	return 0;
}

int delete_val_linklist(Link *ln,DT va)
{
	if(empty_linklist(ln))
		return -1;
	Node *tmp = ln->head;
	if(tmp->data == va)
		pop_front_linklist(ln);
	else
	{
		Node *t = NULL;
		while(tmp!=NULL && tmp->data !=va)
		{
			t = tmp;
			tmp = tmp->next;
		}
		if(!tmp)
			return -2;
		t->next = tmp->next;
		free(tmp);
		ln->count--;
	}
	return 0;
}

DT *find_pos_linklist(Link *ln,int pos)
{
	int i=1;
	int j=-1,k=0;
	int *p=&j;
	int *q=&k;
	if(empty_linklist(ln))
		return q;
	Node *tmp=ln->head;
	while(tmp&&pos!=i)
	{
		tmp=tmp->next;
		i++;
	}
	if(i==pos)
		return &tmp->data;
	else
		return p;
	return NULL;
}

int find_val_linklist(Link *ln,DT va)
{
	if(empty_linklist(ln))
		return -1; 
	Node *tmp = ln->head;
	int pos = 1;//返回位置从1开始
	while(tmp && tmp->data!=va)
	{   
		tmp = tmp->next;
		pos++;
	}   
	if(tmp)
		return pos;
	else
		return -2; 
}

int change_pos_linklist(Link *ln,int pos,DT new_va)
{
	int i=1;
	Node *tmp=ln->head;
	if(empty_linklist(ln))
		return -2;
	while(tmp&&i<pos)
	{
		tmp=tmp->next;
		i++;
	}
		if(i==pos)
			tmp->data=new_va;
		if(tmp==NULL)
			return -1;
	return 0;
}

int change_val_linklist(Link *ln,DT old_va,DT new_va)
{
	if(empty_linklist(ln))
		return -1; 
	Node *tmp = ln->head;
	while(tmp && tmp->data!=old_va)
		tmp = tmp->next;
	
	if(tmp)
		tmp->data = new_va;
	else
		return -2; 

	return 0;
}

int display_linklist(Link *ln)
{
	Node *tmp = ln->head;
	while(tmp)   //while(tmp!=NULL)
	{
		printf("%d ",tmp->data);
		tmp = tmp->next;
	}
	printf("\n");
	return 0;
}

/* 功能:判断是否为空
 * 参数:头结点首地址
 * 返回值:空	1
 *		   非空 0
 * */
int empty_linklist(Link *ln)
{	
	if(ln->count<=0)
		return 1;
	else
		return 0;
}

int free_linklist(Link *ln)
{
	while(!empty_linklist(ln))
		pop_front_linklist(ln);
	free(ln);
	return 0;
}

 main.c //主函数


#include "linklist.h"

int main(int argc,const char* argv[])
{
	Link *ln = create_linklist();
	if(NULL == ln)
		return -1;
	
	for(int i=0;i<10;i++)
	{
//		push_front_linklist(ln,(i+1)*10);
		push_back_linklist(ln,(i+1)*10);
	}

	display_linklist(ln);
//	find_pos(ln); 
//	find_val(ln); 
//	change_val(ln);
//  change_pos(ln);
//	insert_pos(ln);
	insert_val(ln);
//	delete_val(ln);
//	delete_pos(ln);			
//  pop_front(ln);
//  pop_back(ln);
	free_linklist(ln);
	return 0;
}

 linklist.c //负责声明函数和创建帧头和帧尾


#ifndef _LINKLIST_H_
#define _LINKLIST_H_

#include <stdio.h> 
#include <string.h>
#include <stdlib.h>

typedef int DT;  //DT  datatype
typedef struct node
{
	DT			data;	//数据域
	struct node *next;	//指针域
}Node;   //节点类型
typedef struct
{
	Node *head;	//头指针
	int  count;	//计数器
}Link;	//头结点

Link *create_linklist();  //创建头结点
Node *create_linknode(DT va);//创建节点
int push_front_linklist(Link *ln,DT va);
int push_back_linklist(Link *ln,DT va);
int insert_pos_linklist(Link *ln,int pos,DT va);
int insert_val_linklist(Link *ln,DT old_va,DT new_va);
int pop_front_linklist(Link *ln);
int pop_back_linklist(Link *ln);
int delete_pos_linklist(Link *ln,int pos);
int delete_val_linklist(Link *ln,DT va);
DT *find_pos_linklist(Link *ln,int pos);
int find_val_linklist(Link *ln,DT va);
int change_pos_linklist(Link *ln,int pos,DT new_va);
int change_val_linklist(Link *ln,DT old_va,DT new_va);
int display_linklist(Link *ln);
int empty_linklist(Link *ln);
int free_linklist(Link *ln);
void insert_val(Link *ln);
void pop_front(Link *ln);
void pop_back(Link *ln);
void delete_pos(Link *ln);
void change_pos(Link *ln);
void find_pos(Link *ln);
void find_val(Link *ln);
void change_val(Link *ln);
void insert_pos(Link *ln);
void delete_val(Link *ln);
#endif

input.c  //负责输入输出



#include "linklist.h"
void insert_val(Link *ln)
{
	int old_va=0;
	int new_va=0;
	printf("在哪个数据上插入\n");
	scanf("%d",&old_va);
	printf("请输入要插入的数值\n");
	scanf("%d",&new_va);
	int ret=insert_val_linklist(ln,old_va,new_va);
	if(ret == -1)
		printf("Empty Linklist!\n");
	else if(ret == -2)
		printf("Not Find!\n");
	else
		display_linklist(ln);
	
}
void pop_front(Link *ln)
{
	pop_front_linklist(ln);
	display_linklist(ln);
}

void pop_back(Link *ln)
{
	pop_back_linklist(ln);
	display_linklist(ln);
}
void delete_pos(Link *ln)
{
	int pos=0;
	printf("请输入要删除的位置\n");
	scanf("%d",&pos);
	int ret=delete_pos_linklist(ln,pos);
	if(ret == -1)
		printf("Empty Linklist!\n");
	else if(ret == -2)
		printf("Not Find!\n");
	else
		display_linklist(ln);
}
void change_pos(Link *ln)
{	
	int pos=0;
	int val=0;
	printf("请输入要删除的位置\n");
	scanf("%d",&pos);
	printf("请输入要改的值\n");
	scanf("%d",&val);
	int ret=change_pos_linklist(ln,pos,val);
	if(ret == -2)
		printf("Empty Linklist!\n");
	else if(ret == -1)
		printf("Not Find!\n");
	else
		display_linklist(ln);

}
void find_pos(Link *ln)
{
	int pos=0;
	printf("请输入查找的位置\n");
	scanf("%d",&pos);
	int ret= *find_pos_linklist(ln,pos);
	if(ret == 0)
		printf("Empty Linklist!\n");
	else if(ret == -1)
		printf("Not Find!\n");
	else
		printf("%d的位置是%d\n",pos,ret);


}

void find_val(Link *ln)
{
	DT va = 0;
	printf("请输入要查找的值:\n");
	scanf("%d",&va);
	int ret = find_val_linklist(ln,va);
	if(ret == -1)
		printf("Empty Linklist!\n");
	else if(ret == -2)
		printf("Not Find!\n");
	else
		printf("%d的位置是%d\n",va,ret);
}

void change_val(Link *ln)
{
	DT old_va = 0,new_va = 0;
	printf("请输入要修改的值和修改后的值:\n");
	scanf("%d %d",&old_va,&new_va);
	int ret = change_val_linklist(ln,old_va,new_va);
	if(ret == -1)
		printf("Empty Linklist!\n");
	else if(ret == -2)
		printf("Not Find!\n");
	else
		display_linklist(ln);
}

void insert_pos(Link *ln)
{
	DT va = 0;
	int pos = 0;
	printf("请输入要插入的位置和值:\n");
	scanf("%d %d",&pos,&va);
	int ret = insert_pos_linklist(ln,pos,va);
	if(ret == -1)
		printf("空链表!\n");
	else if(ret == -2)
		printf("输入的位置不在范围之内!\n");
	else
		display_linklist(ln);
}

void delete_val(Link *ln)
{
	DT va = 0;
	printf("请输入要删除的值:\n");
	scanf("%d",&va);
	int ret = delete_val_linklist(ln,va);
	if(ret == -1)
		printf("Empty Linklist!\n");
	else if(ret == -2)
		printf("Not Find!\n");
	else
		display_linklist(ln);
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值