数据结构DAY4

#ifndef __HEAD_H__
#define __HEAD_H__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char datatype[20];
//定义结构体
typedef struct Node{
	//数据域
	union{
		int len;//头结点的数据域
		datatype data;//其他结点的数据域数据元素
	};
	//指针域:下一个结点的地址
	struct Node *next;
}*Linklist;

Linklist Create_h();
Linklist Create_m();
int insert_t(Linklist L,datatype e);
void Output(Linklist L);
int insert_w(Linklist L,datatype e);
int delete_h(Linklist L);
int  delete_w(Linklist L);
int insert_pos(Linklist L,int pos,datatype e);
int delete_pos(Linklist L,int pos);
int mod_pos(Linklist L,int pos,datatype e);
int find_pos(Linklist L,int pos);
int find_e(Linklist L,datatype e);


#endif

#include "head.h"

int main(int argc,const char *argv[])
{
	//创建头结点
	Linklist L=Create_h();
#if 1
	//单链表头插,一次只能插入一个数据元素
	//如需n个,循环调用
	int n;
	datatype e;//插入的数据元素
	printf("请输入要头插的字符串的个数:");
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		printf("请输入要头插的字符串:");
		scanf("%s",e);
		insert_t(L,e);
	}

	//遍历
	printf("头插字符串后:\n");
	Output(L);
#endif
#if 1
	//尾插:永远在链表尾部插入,一次插入一个
	//循环调用尾插函数
	printf("请输入要尾插的字符串的个数:");
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		printf("请输入要尾插的字符串:");
		scanf("%s",e);
		insert_w(L,e);
	}
	printf("尾插字符串后:\n");
	Output(L);
#endif

	//头删:只删除头结点后面的结点
	printf("请输入要头删的字符串的个数:");
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		delete_h(L);
	}
	printf("头删字符串后:\n");
	Output(L);
	
	//尾删:永远删除最后一个结点
	printf("请输入要尾删的字符串的个数:");
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		delete_w(L);
	}
	printf("尾删字符串后:\n");
	Output(L);

	//按位置插入
	int pos;
	printf("请输入插入的位置:");
	scanf("%d",&pos);
	printf("请输入要插入的字符串:");
	scanf("%s",e);
	insert_pos(L,pos,e);

	//按位置删除
	printf("请输入要删除的位置:");
	scanf("%d",&pos);
	delete_pos(L,pos);

	//按位置修改
	printf("请输入要修改的位置:");
	scanf("%d",&pos);
	printf("请输入要修改为的值:");
	scanf("%s",e);
	mod_pos(L,pos,e);

	//按位置查找
	printf("请输入要查找的位置:");
	scanf("%d",&pos);
	find_pos(L,pos);

	//按元素查找
	printf("请输入要查找的元素:");
	scanf("%s",e);
	find_e(L,e);
	return 0;
}



#include "head.h"

//在堆区创建头结点
//无参
//返回头结点地址,失败返回NULL
Linklist Create_h(){
	Linklist L=(Linklist)malloc(sizeof(struct Node));
	//失败
	if(L==NULL){
		return NULL;
	}
	//成功
	L->len=0;
	L->next=NULL;
	return L;
}

//创建其他结点
//无参
//成功返首地址,失败返NULL
Linklist Create_m(){
	Linklist p=(Linklist)malloc(sizeof(struct Node));
	if(p==NULL){
		return NULL;
	}
	strcpy(p->data,"");
	p->next=NULL;
	return p;
}

//头插:永远在头结点后面
//参数:头结点 插入的数据元素
//成功返0,失败返-1
int insert_t(Linklist L,datatype e){
	if(L==NULL){
		printf("头插失败\n");
		return -1;
	}
	//2.在堆区申请其他结点空间
	Linklist p=Create_m();
	//p的数据赋值位e
	strcpy(p->data,e);
	//p的指针域
	p->next=L->next;
	L->next=p;
	//链表长度自增
	L->len++;
}

//链表的遍历
//参数:链表
//无返回值函数
void Output(Linklist L){
	//判断头结点是否存在
	//判断链表是否为空
	if(L==NULL || L->len==0){
		printf("输出失败\n");
		return;
	}
#if 1
	Linklist p=L;
	for(int i=0;i<L->len;i++){
		p=p->next;
		printf("%s\t",p->data);
	}
#endif
#if 0
	while(L->next!=NULL){
		L=L->next;
		printf("%s\t",L->data);
	}
#endif
	printf("\n");
}
//尾插:永远在尾部插入
//参数:链表 插入的数据元素
//成功返0,失败返-1
int insert_w(Linklist L,datatype e){
	//判断头结点是否存在
	if(L==NULL){
		printf("尾插失败\n");
		return -1;
	}
	//尾插
	//先找到最后一个结点
	Linklist p=L;
	while(p->next!=NULL){
		p=p->next;
	}
	//创建新结点
	Linklist s=Create_m();
	if(s==NULL)
		return -1;
	//s的数据域
	strcpy(s->data,e);
	//s的指针域
	p->next=s;
	L->len++;
	return 0;
}

//头删:删除头结点后面的结点
//参数:链表
//成功返回0,失败返回-1
int delete_h(Linklist L){
	//判断结点是否存在
	//判断链表是否为空
	if(L==NULL || L->len==0){
		printf("删除失败\n");
		return -1;
	}
	//删除
	Linklist q=L->next;
	L->next=q->next;
	free(q);
	q=NULL;
	L->len--;
	return 0;
}

//尾部删除
//参数:链表
//成功返回0,失败返回-1
int  delete_w(Linklist L){
	//判断结点是否存在
	//判断链表是否为空
	if(L==NULL || L->len==0){
		printf("删除失败\n");
		return -1;
	}
	//删除
	Linklist q=L->next;
	for(int i=0;i<L->len-1;i++){
		q=q->next;
	}
	free(q);
	q=NULL;
	L->len--;
	return 0;
}

//
//
//
int insert_pos(Linklist L,int pos,datatype e){
	//判断结点是否存在
	//判断位置是否合法
	if(L==NULL || pos<=0 || pos>L->len+1){
		printf("插入失败\n");
		return -1;
	}
	//找到pos-1位置,起名p
	Linklist p=L;
	for(int i=0;i!=pos-1;i++){
		p=p->next;
	}
	//创建新结点s
	Linklist s=Create_m();
	//s的数据域
	strcpy(s->data,e);
	//s的指针域
	s->next=p->next;
	p->next=s;
	L->len++;
	printf("插入字符串后:\n");
	Output(L);
	return 0;
}

int delete_pos(Linklist L,int pos){
	if(L==NULL || pos<=0 || pos>L->len){
		printf("删除失败\n");
		return -1;
	}
	Linklist p=L;
	for(int i=0;i!=pos-1;i++){
		p=p->next;
	}
	Linklist s=Create_m();
	s=p->next;
	p->next=s->next;
	L->len--;
	printf("删除字符串后:\n");
	Output(L);
	return 0;
}

int mod_pos(Linklist L,int pos,datatype e){
	if(L==NULL || pos<=0 || pos>L->len){
		printf("修改失败\n");
		return -1;
	}
	Linklist p=L;
	for(int i=0;i!=pos;i++){
		p=p->next;
	}
	strcpy(p->data,e);
	printf("修改字符串后:\n");
	Output(L);
	return 0;
}
int find_pos(Linklist L,int pos){
	if(L==NULL || pos<=0 || pos>L->len){
		printf("查找失败\n");
		return -1;
	}
	Linklist p=L;
	for(int i=0;i!=pos;i++){
		p=p->next;
	}
	printf("查找位置的字符串是:%s\n",p->data);
	return 0;
}
int find_e(Linklist L,datatype e){
	if(L==NULL)
		return -1;
	Linklist p=L;
	for(int i=0;i<=L->len;i++){
		int a=strcmp(p->data,e);
		if(a==0){
			printf("查找的字符串在%d的位置上\n",i);
		}
		p=p->next;
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值