数据结构day4

head.h

#ifndef __HEAD_H__
#define __HEAD_H__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int datatype;
typedef struct Node{
	//数据域
	union{
		int len;//头文件的数据域,链表长度
		datatype data;//普通节点的数据域
	};
	//指针域
	struct Node * next;//下一个节点的地址
}*linklist;


linklist create_node(int flag);
int insert_head(linklist L,datatype e);
void output(linklist L);
linklist insert_rear(linklist L,datatype ,linklist rear);
int delete_head(linklist L);
int delete_rear(linklist L);
int insert_pos(linklist L,int pos,datatype e);
int delete_pos(linklist L,int pos);
int find_pos(linklist L,datatype e);
int updata_pos(linklist L,int pos,datatype e);
int element_chang(linklist L,datatype key,datatype e);
int element_insert(linklist L,datatype key,datatype e);
int element_delete(linklist L,datatype key);
void rev_linklist(linklist L);
#endif

test.c

#include "head.h"
/*
 * function:    创建节点
 * @param [ in] 
 * @param [out] 1表示创建头节点,0表示创建普通节点
 * @return      成功返回首地址,失败NULL
 */
linklist create_node(int flag){
	linklist L=(linklist)malloc(sizeof(struct Node));
	if(NULL==L)return NULL;
	//对L节点的初始化
	if(flag==1)//对L节点数据域清空
		L->len=0;	
	else if(flag==0)
		L->data=0;
	L->next=NULL;//将L的指针域指向NULL
	return L;
}

/*
 * function:    头插
 * @param [ in] 
 * @param [out] 头结点 值
 * @return      成功返回0,失败-1
 */
int insert_head(linklist L,datatype e){
	if(NULL==L)return -1;
	linklist s=create_node(0);
	if(NULL==s)return -1;
	//s的数据域
	s->data=e;
	s->next=L->next;
	L->next=s;
	L->len++;
	return 0;
}

/*
 * function:    输出
 * @param [ in] 
 * @param [out] 链表*L
 * @return      无
 */
void output(linklist L){
	if(NULL==L || L->next==NULL)return;
	linklist p=L;
	//根据链表长度len
#if 0
	for(int i=0;i<L->len;i++){
		p=p->next;
		printf("%d\t",p->data);
	}
#endif
#if 1
	//根据NULL
	while(p->next!=NULL){
		p=p->next;
		printf("%d\t",p->data);
	}
#endif 
	puts("");
}

/*
 * function:    尾插
 * @param [ in] 头节点L,插入的值
 * @param [out] 尾节点
 * @return      返回尾节点
 */
linklist insert_rear(linklist L,datatype e,linklist rear){
	if(NULL==L)return NULL;
	linklist s=create_node(0);
	if(NULL==s)return NULL;
	s->data=e;
	rear->next=s;//从尾节点插入
	L->len++;
	rear=s;
	return rear;
}

/*
 * function:    头删除
 * @param [ in] 链表
 * @param [out] 
 * @return      成功0,失败-1
 */
int delete_head(linklist L){
	if(NULL==L || NULL ==L->next)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(NULL==L || NULL ==L->next)return -1;
	linklist p=L;
	while(p->next->next!=NULL){//将p移动到尾节点的上一个节点
		p=p->next;
	}
	free(p->next);
	p->next=NULL;
	L->len--;
	return 0;
}

/*
 * function:    任意位置插入
 * @param [ in] 链表 位置 值
 * @param [out] 
 * @return      成功0,失败-1
 */
int insert_pos(linklist L,int pos,datatype e){
	if(NULL==L || L->next==NULL || pos<1 || pos>L->len+1)return -1;
	linklist p=L;
	for(int i=0;i<pos-1;i++){
		p=p->next;
	}
	linklist s=create_node(0);
	s->data=e;
	s->next=p->next;
	p->next=s;
	L->len++;
	return 0;
}

/*
 * function:    按任意位置删除
 * @param [ in] 链表,删除的位置
 * @param [out] 
 * @return      成功0,失败-1
 */
int delete_pos(linklist L,int pos){
	//判断链表为空,位置不合法
	if(NULL==L || pos<1 || pos>L->len)return -1;
	linklist p=L;
	for(int i=0;i<pos-1;i++){
		p=p->next;
	}
	linklist q=p->next;
	p->next=q->next;
	free(q);
	q=NULL;
	return 0;
}

/*
 * function:    查找值
 * @param [ in] 链表 要找的值
 * @param [out] 
 * @return      成功返回节点地址,失败返回-1
 */
int find_pos(linklist L,datatype e){
	if(NULL==L || NULL==L->next)return -1;
	linklist p=L;
	for(int i=1;i<L->len+1;i++){
		p=p->next;
		if(p->data==e)
			return i;
	}
	return -1;	
}
/*
 * function:    任意位置修改
 * @param [ in] 链表 位置 修改后的值
 * @param [out] 
 * @return      成功0;失败-1;
 */
int updata_pos(linklist L,int pos,datatype e){
	if(NULL==L || NULL==L->next)return -1;
	linklist p=L;
	for(int i=0;i<pos;i++){
		p=p->next;
	}
	p->data=e;
	return 0;
}

/*
 * function:    按元素修改
 * @param [ in] 链表 要修改的值 修改后的值
 * @param [out] 
 * @return      成功0;失败-1
 */
int element_chang(linklist L,datatype key,datatype e){
	if(NULL==L || NULL==L->next)return -1;
	int sub=find_pos(L,key);
	if(sub=-1)return -1;
	updata_pos(L,sub,e);
	return 0;
}

/*
 * function:    按元素插入
 * @param [ in] 链表 要修改的值 修改后的值
 * @param [out] 
 * @return     成功0;失败-1 
 */
int element_insert(linklist L,datatype key,datatype e){
	if(NULL==L || NULL==L->next)return -1;
	int sub=find_pos(L,key);
	if(sub=-1)return -1;
	insert_pos(L,sub,e);
	return 0;
}
/*
 * function:    按元素删除
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int element_delete(linklist L,datatype key){
	if(NULL==L || NULL==L->next)return -1;
	int sub=find_pos(L,key);
	if(sub=-1)return -1;
	delete_pos(L,sub);
	return -1;
}
/*
 * function:    单列表逆至
 * @param [ in] 列表
 * @param [out] 
 * @return      
 */
void rev_linklist(linklist L){
	if(NULL==L || NULL==L->next)return;
	linklist p=L->next;
	L->next=NULL;
	while(p!=NULL){
		linklist t=p;
		p=p->next;
		L->next=t;
	}
}

main.c

#include "head.h"

int main(int argc, const char *argv[])
{
	int flag=0;
	linklist L=create_node(flag);
	int n=0;
	linklist rear=L;//定义尾节点
	printf("插入个数:");
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		datatype e;
		printf("%d.输入插入的值:",i);
		scanf("%d",&e);
		//insert_head(L,e);
		rear=insert_rear(L,e,rear);
	}
	output(L);
/*
	//头删除
	delete_head(L);
	delete_head(L);
	delete_head(L);
	//尾删除
	delete_rear(L);
	*/
	//任意位置插入
	int pos=0;//下标
	datatype e=0;//值
	printf("输入插入的位置和插入的值:");
	scanf("%d %d",&pos,&e);
	insert_pos(L,pos,e);
	output(L);
	//任意位置删除
	printf("删除的位置:");
	scanf("%d",&pos);
	delete_pos(L,pos);	
	output(L);
	//查找值
	printf("查找的值");
	scanf("%d",&e);
	pos=find_pos(L,e);
	printf("位置是%d\n",pos);
	//任意位置修改;
	printf("位置和修改后的值:");
	scanf("%d %d",&pos,&e);
	updata_pos(L,pos,e);
	output(L);

	//按元素修改
	datatype key;
	printf("输入要修改的值和改之后的值");
	scanf("%d %d",&key,&e);
	//element_chang(L,key,e);
	//element_insert(L,key,e); //按元素插入
	element_delete(L,key);//按元素删除
	output(L);

	//单列表逆至
	rev_linklist(L);
	output(L);
	
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值