链表相关操作

头文件

#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef char datetype[20];
//定义结点结构体

typedef struct Node{
	//数据域:
	union{
		int len;//头结点的数据域
		datetype date;//其他节点的数据域数据元素
	};
	//指针域:下个结点的地址
	struct Node *next;
}*Linklist;

//创建头结点
Linklist creat_head();
//创建其他结点
Linklist creat_node();
//头插
int insert_head(Linklist L,datetype e);
//输出
void Output(Linklist L);
//尾插
int insert_rear(Linklist L,datetype e);
//头删
int delete_head(Linklist L);
//尾删
int delete_rear(Linklist L);
//按位插入
int insert_sub(Linklist L,int sub,datetype e);
//按位删除
int delete_sub(Linklist L,int sub);
//按位修改
int update_sub(Linklist L,int sub,datetype e);
//按位查找
char *search_sub(Linklist L,int sub);
//按元素查找
int search_key(Linklist L,datetype key);
//按元素修改
void update_key(Linklist L,datetype key,datetype e);
//按元素删除
void delete_key(Linklist L,datetype key);

#endif

主函数

#include"head.h"
int main(int argc, const char *argv[])
{
	//创建头结点
	Linklist L=creat_head();

	//头插/尾插   一次只能插入一个数据元素
	//如果需要插入n个,循环调用
	
	int n;
	datetype e;//插入的数据元素
	printf("请输入插入元素个数\n");
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		printf("请输入插入的字符串:");
		scanf("%s",e);
	//	insert_head(L,e);//头插
		insert_rear(L,e);//尾插
	}
	printf("输出结果为:\n");
	Output(L);

	printf("头删的结果为:\n");
	delete_head(L);//头删
	Output(L);
	printf("尾删后的结果为:\n");
	delete_rear(L);//尾删
	Output(L);

	//按位插入
	
	printf("请输入你要插入的下标:\n");
	scanf("%d",&n);
	printf("请输入你要插入的数据\n");
	scanf("%s",e);
	insert_sub(L,n,e);
	printf("插入后链表为\n");
	Output(L);
	
	//按位删除
	printf("请输入你要删除的下标:\n");
	scanf("%d",&n);
	printf("删除后链表为\n");
	delete_sub(L,n);
	Output(L);
	
	//按位修改 
	
	printf("请输入要修改的元素下标\n");
	scanf("%d",&n);
	printf("请输入要修改后的数据\n");
	scanf("%s",e);
	printf("修改后的链表为:\n");
	update_sub(L,n,e);
	Output(L);

	//按位查找
	
	printf("请输入要查找的元素下标\n");
	scanf("%d",&n);
	char *p=search_sub(L,n);
	printf("查找的元素为:%s\n",p);

	//按元素查找
	
	datetype key;
	printf("请输入要查找的元素\n");
	scanf("%s",key);
	printf("查找的元素下标为:\n");
	printf("%d\n",search_key(L,key));

	//按元素修改
	
	printf("请输入要修改的元素\n");
	scanf("%s",key);
	printf("请输入修改后的元素\n");
	scanf("%s",e);
	update_key(L,key,e);
	Output(L);

	//按元素删除
	
	printf("请输入要删除的元素\n");
	scanf("%s",key);
	delete_key(L,key);
	Output(L);

	return 0;
}

函数体

#include"head.h"
/*
 *function:  在堆区创建头结点  
 *@param[in]  无参
 *@param[out]  
 *@return  返回头结点地址,失败返回NULL
 */
Linklist creat_head(){
	Linklist L=(Linklist)malloc(sizeof(struct Node));
	if(L==NULL)
		return NULL;
	L->len=0;
	L->next=NULL;
	return L;
}
/*
 *function:  创建其他结点  
 *@param[in]  无参数
 *@param[out]  
 *@return  成功返回首地址,失败返回NULL
 */
Linklist creat_node(){
	Linklist p=(Linklist)malloc(sizeof(struct Node));
	if(p==NULL)
		return NULL;
	strcpy(p->date,"");
	p->next=NULL;
	return p;
}
/*
 *function:  头插:永远是找头结点后面插入  
 *@param[in]  头结点 插入的数据元素
 *@param[out]  
 *@return  成功返回0 失败返回-1;
 */
int insert_head(Linklist L,datetype e){
	if(L==NULL){
		printf("头插入失败\n");
		return -1;
	}
	//2在堆区申请其他节点空间
	Linklist p=creat_node();
	//p的数据值为e
	strcpy(p->date,e);
	//p的指针域
	p->next=L->next;
	L->next=p;
	//链表自增
	L->len++;
	return 0;
}
/*
 *function:  链表的遍历  
 *@param[in]  链表
 *@param[out]  
 *@return  无返回值
 */
void Output(Linklist L){
	//1判断结点是否存在
	//2判断链表是否为空
	if(L==NULL||L->len==0){
		printf("输出失败\n");
	}
	Linklist p=L;
	for(int i=0;i<L->len;i++){
		p=p->next;
		printf("%s\t",p->date);
	}
	printf("\n");
	/*
	while(L->next!=NULL){
		L=L->next;
		printf("%s\t",L->date);
	}*/
}
/*
 *function:    永远在尾部插入,一次插入一个
 *@param[in]  
 *@param[out]  
 *@return  成功返回0 失败返回-1
 */
int insert_rear(Linklist L,datetype e){
	if(L==NULL)
		return -1;
	Linklist p=L;
	while(p->next!=NULL){
		p=p->next;
	}
	//创建新的节点
	Linklist s=creat_node();
	if(s==NULL)
		return -1;
	//s的数据yu为
	strcpy(s->date,e);
	//s的指针域
	p->next=s;
	L->len++;
		return 0;
}
/*
 *function:  头删  
 *@param[in]  链表
 *@param[out]  
 *@return  成功返回0 失败返回-1
 */
int delete_head(Linklist L){
	if(L->len==0||L==NULL){
		printf("删除失败");
		return -1;
	}
	Linklist q=L->next;
	L->next=q->next;
	free(q);
	q=NULL;//防止野指针
	L->len--;
	return 0;

}
/*
 *function:  尾删  
 *@param[in]  链表
 *@param[out]  
 *@return  成功返回0 失败返回-1
 */
int delete_rear(Linklist L){
	if(L->len==0||L==NULL){
		printf("删除失败");
		return -1;
	}
	Linklist p=L;
	for(int i=0;i<L->len-1;i++){
		p=p->next;
	}
	free(p->next);
	p->next=NULL;
	L->len--;
	return 0;
}
/*
 *function:    按位插入
 *@param[in]  链表,插入的下标 插入的值
 *@param[out]  
 *@return  成功返回0,失败返回-1
 */
int insert_sub(Linklist L,int sub,datetype e){
	if(L==NULL||sub<1||sub>L->len+1){
		printf("插入失败\n");
		return -1;
	}
	Linklist p=L;
	for(int i=0;i<sub-1;i++){
		p=p->next;
	}
		//创建新节点
		Linklist s=creat_node();
		//s的数据域为
		strcpy(s->date,e);
		//s的指针域
		s->next=p->next;
		p->next=s;
		L->len++;
		return 0;
}
/*
 *function:  按位删除  
 *@param[in]  链表 删除的下标
 *@param[out]  
 *@return  成功返回0 失败返回-1
 */
int delete_sub(Linklist L,int sub){
	if(L==NULL||L->len==0||sub<1||sub>L->len){
		printf("删除失败\n" );
		return -1;
	}
	Linklist p=L;
	for(int i=0;i<sub-1;i++){
		p=p->next;
	}
	Linklist s=p->next;
	p->next=s->next;
	free(s);
	L->len--;
	return 0;
}
/*
 *function:  按位修改  
 *@param[in]  链表 修改的下标 修改后的数据
 *@param[out]  
 *@return  成功返回0,失败返回-1;
 */
int update_sub(Linklist L,int sub,datetype e){
	if(L==NULL||L->len==0||sub<1||sub>L->len){
		printf("修改失败\n" );
		return -1;
	}
	Linklist p=L;
	for(int i=0;i<sub-1;i++){
		p=p->next;
	}
	Linklist s=p->next;
	strcpy(s->date,e);
	return 0;
}
/*
 *function:  按位查找  
 *@param[in]  链表 查找的下标
 *@param[out]  
 *@return  成功返回查找的数据 失败无返回
 */
char *search_sub(Linklist L,int sub){
	if(L==NULL||L->len==0||sub<1||sub>L->len){
		printf("查找失败\n" );
	}
	Linklist p=L;
	for(int i=0;i<sub-1;i++){
		p=p->next;
	}
	return p->next->date;
}
/*
 *function: 按元素查找  
 *@param[in]  链表 查找的元素
 *@param[out]  
 *@return  失败返回-1,成功返回下标;
 */
int search_key(Linklist L,datetype key){
	Linklist p=L;
	for(int i=0;i<=L->len;i++){
		if(strcmp(key,p->date)==0){
			return i;
		}
		p=p->next;
	}
	return 0;
}
/*
 *function:  按元素修改  
 *@param[in]  链表 要修改的元素  修改后的数据
 *@param[out]  
 *@return  无返回值
 */
void update_key(Linklist L,datetype key,datetype e){
	int flag=search_key(L,key);
	update_sub(L,flag,e);
}
/*
 *function:  按元素删除  
 *@param[in]  链表 要删除的元素
 *@param[out]  
 *@return  无返回值
 */
void delete_key(Linklist L,datetype key){
	int flag=search_key(L,key);
	delete_sub(L,flag);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值