顺序表和单向链表练习

/*单向链表练习:

链表中存储数据类型为字符申,请完成以下功能

1.在堆区申请空间

2.实现头插、头删、尾插、尾删

3,遍历链表

4.在任意位置插入

5,任意位置删除

6,按元素修改

7,按元素查找

8.单向链表逆置

9,链表降序排序

10,释放链表空间*/

#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
	union {
		int len;
		char data[20];
	};
	struct node*next;
}Linklist;
//单向链表练习:
 //链表中存储数据类型为字符申,请完成以下功能
//1.在堆区申请空间
Linklist*RequestSpace();
//创建头节点
Linklist* CreatTrailNode();
//创建新节点
Linklist* CreatNewNode();
//2.实现头插、头删、尾插、尾删
void InsertTrail(Linklist*L,char value[]);
//尾插
void InsertEnd(Linklist*L,char value[]);
//3,遍历链表
void OutPutLinklist(Linklist *L);
//4.在任意位置插入
void InsertPos(Linklist*L,int pos,char value[]);
//5,任意位置删除
void DelPos(Linklist*L,int pos);
//6,按元素修改
void ModElement(Linklist*L,char value[],char value1[]);
//7,按元素查找
void FindElement(Linklist*L,char value[]);
//8.单向链表逆置
void RevLinklist(Linklist*L);
//9,链表降序排序
void SortLinklist(Linklist*L);
//10,释放链表空间
void FreeSpace(Linklist**L);	

#endif
/*单向链表练习:
链表中存储数据类型为字符申,请完成以下功能
1.在堆区申请空间
2.实现头插、头删、尾插、尾删
3,遍历链表
4.在任意位置插入
5,任意位置删除
6,按元素修改
7,按元素查找
8.单向链表逆置
9,链表降序排序
10,释放链表空间*/
#include"link_list.c"

int main(int argc, const char *argv[])
{
	Linklist*L=RequestSpace();
	if(L==NULL){
		printf("创建链表失败\n");
		return -1;
	}
	printf("输入插入的个数\n");
	char arr[20];
	int num;
	scanf("%d",&num);
	for(int i=0;i<num;i++){
		scanf("%s",arr);
		//InsertTrail(L,arr);
		//尾部插入
		InsertEnd(L,arr);
	}
	OutPutLinklist(L);
#if 1

	//4.在任意位置插入
	printf("任意位置插入\n");
	int pos;
	char value[20];
	printf("输入要插入的位置\n");
	scanf("%d",&pos);
	printf("输入要插入的字符串\n");
	scanf("%s",value);
	InsertPos(L,pos,value);
	OutPutLinklist(L);

	//4.在任意位置删除
	printf("任意位置删除\n");
	int a;
	printf("输入要删除的位置\n");
	scanf("%d",&a);
	DelPos(L,a);
	OutPutLinklist(L);

	putchar(10);	
	printf("***********\n");
	char b[20];
	char c[20];
	printf("查找要修改的元素\n");
	scanf("%s",b);
	printf("输入元素修改\n");
	scanf("%s",c);
	ModElement(L,b,c);
	OutPutLinklist(L);

	printf("***********\n");
	char e[20];
	printf("查找元素\n");
	scanf("%s",e);
	FindElement(L,e);

	printf("逆序\n");
	RevLinklist(L);
	OutPutLinklist(L);

	//9,链表降序排序
	SortLinklist(L);
	OutPutLinklist(L);

	//10,释放链表空间
	FreeSpace(&L);
	if(L==NULL){
		printf("释放成功\n");
	}
	else{
		printf("释放空间失败\n");
	}
#endif
	return 0;
}
#include"link_list.h"
//单向链表练习:
//链表中存储数据类型为字符申,请完成以下功能
//1.在堆区申请空间
Linklist*RequestSpace()
{
	Linklist*p=(Linklist*)malloc(sizeof(Linklist));
	if(p==NULL){
		printf("申请空间失败\n");
		return NULL;
	}
	return p;
}
//创建头节点
Linklist* CreatTrailNode()
{
	Linklist*p=RequestSpace();
	if(p==NULL){
		printf("创建头节点失败\n");
		return NULL;
	}
	p->next=NULL;
	p->len=0;
	return p;
}
//创建新节点
Linklist* CreatNewNode()
{
	Linklist*p=RequestSpace();
	if(p==NULL){
		printf("创建头节点失败\n");
		return NULL;
	}
	p->next=NULL;
	strcpy(p->data,"0");
	return p;
}
//2.实现头插、头删、尾插、尾删
void InsertTrail(Linklist*L,char value[])
{
	Linklist*p=CreatNewNode();
	if(p==NULL){
		printf("创建新节点失败\n");
		return;
	}
	p->next=L->next;
	L->next=p;
	strcpy(p->data,value);
	L->len++;
}
//尾插
void InsertEnd(Linklist*L,char value[])
{
	Linklist*p=CreatNewNode();
	Linklist*q=L;
	if(p==NULL){
		printf("创建新节点失败\n");
		return;
	}
	while(q->next!=NULL){
		q=q->next;
	}
	strcpy(p->data,value);
	q->next=p;
	L->len++;
}
//3,遍历链表
void OutPutLinklist(Linklist *L)
{
	Linklist*p=L;
	for(int i=0;i<L->len;i++){
		p=p->next;
		printf("%s\t",p->data);
	}
}
//4.在任意位置插入
void InsertPos(Linklist*L,int pos,char value[])
{
	Linklist*p=L;
	if(pos>L->len||pos<=0){
		printf("插入位置非法\n");
	}
	for(int i=0;i<pos-1;i++){
		p=p->next;
	}
	Linklist*q=CreatNewNode();
	q->next=p->next;
	p->next=q;
	strcpy(q->data,value);
	L->len++;
}
//5,任意位置删除
void DelPos(Linklist*L,int pos)
{
	if(pos>L->len||pos<=0){
		printf("输入位置参数错误\n");
		return ;
	}
	Linklist*p=L;
	for(int i=0;i<pos-1;i++){
		p=p->next;
	}
	Linklist*q=p->next;
	p->next=p->next->next;
	free(q);
	q=NULL;
	L->len--;
}
//6,按元素修改
void ModElement(Linklist*L,char value[],char value1[])
{
	Linklist*p=L;
	int count=0;
	for(int i=0;i<L->len;i++){
		p=p->next;
		if(strcmp(value,p->data)==0){
			strcpy(p->data,value1);
			count++;
		}
	}
	if(count==0){
		printf("该元素不存在\n");
	}
}
//7,按元素查找
void FindElement(Linklist*L,char value[])
{
	Linklist*p=L;
	int count=0;
	for(int i=0;i<L->len;i++){
		p=p->next;
		if(strcmp(p->data,value)==0){
			printf("该元素在%d位置上\n",i+1);
			count++;
		}
	}
	if(count==0){
		printf("该元素不存在\n");
	}
}
//8.单向链表逆置
void RevLinklist(Linklist*L)
{
	Linklist*q=L;
	Linklist*p=L->next;
	L->next=NULL;
	while(p!=NULL){
		Linklist*t=p;
		p=p->next;
		t->next=q->next;
		q->next=t;
	}

}
//9,链表降序排序
void SortLinklist(Linklist*L)
{

	Linklist*p=L->next;
	L->next=NULL;
	while(p!=NULL){
		Linklist *q=L;
		Linklist*t=p;
		p=p->next;
		if(q->next==NULL){
			t->next=L->next;
			L->next=t;
		}
		else{
			while((strcmp(q->next->data,t->data))>0){
				q=q->next;
			}
			t->next=q->next;
			q->next=t;
		}
	}
}
//10,释放链表空间
void FreeSpace(Linklist**L)
{
	Linklist**p=L;
	for(int i=0;i<(*L)->len;i++){
		*p=(*p)->next;
		free(*p);
	}
	*p=NULL;
}

1.在堆区申请空间

2,实现顺序表数据元素在表尾录入

3,实现顺序表输出

4.实现顺序表按下标插入商品信息

5,实现顺序表按下标删除商品信息

6,查找商品名称key是否在购物车信息中出现

7,修改商品名称key的购买数量,修改为n

8,删除最贵的商品信息

9,对商品总价实现升序排序

10,如果有两个商品名称相同的商品信息.则去重

11,释放堆区空间*/


#ifndef __SHOOPCARSQELIST_H__
#define __SHOOPCARSQELIST_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 20
typedef struct{
	char name[20];
	char arrriture[20];
	float price;
	int num;
}Goods;
typedef struct{
	Goods data[MAXSIZE];
	int len;
}Seqlist;
//1.在堆区申请空间
Seqlist* RequestSpace();
//2,实现顺序表数据元素在表尾录入
void TrialSeqlist(Seqlist*L,int number);
//3,实现顺序表输出
void OutPutSeqlist(Seqlist*L);
//顺序表判满
//0表示满了,-1表示没满;
int FullSeqlist(Seqlist*L);
//顺序表判空
//0表示空了,-1表示没空;
int EmptySeqlist(Seqlist*L);
//4.实现顺序表按下标插入商品信息
int InserIndexBydata(Seqlist*L,int index);
//5,实现顺序表按下标删除商品信息
int DelByGood(Seqlist*L,int index);
//6,查找商品名称key是否在购物车信息中出现
int* FindName(Seqlist*L,char key[]);
//7,修改商品名称key的购买数量,修改为n
int ModifyGoodsBynameBysum(Seqlist*L,char key[],int n);
//8,删除最贵的商品信息
int DelExpensiveBygood(Seqlist*L);
//9,对商品总价实现升序排序
void SortPrice(Seqlist*L);
//10,如果有两个商品名称相同的商品信息.则去重
void RemovSame(Seqlist*L);
//11,释放堆区空间*/
void FreeSpace(Seqlist**L);
#endif
顺序表练习:
请实现购物车系统,把商品[商品名称,商品属性.价格,个数]信息存储到顺序表中,请完成- : 下操作操作
结构体定义
typedef struct
char name[201://名称
char arrri ture[201;//圖性
float price;//价格
nt num://个数
}Goods:
typedef struct
Goods data[MAXSIZE];
int 1en;
}5eqlist;
1.在堆区申请空间
2,实现顺序表数据元素在表尾录入
3,实现顺序表输出
4.实现顺序表按下标插入商品信息
5,实现顺序表按下标删除商品信息
6,查找商品名称key是否在购物车信息中出现
7,修改商品名称key的购买数量,修改为n
8,删除最贵的商品信息
9,对商品总价实现升序排序
10,如果有两个商品名称相同的商品信息.则去重
11,释放堆区空间

#include"ShoopCarSqelist.c"
int main(int argc, const char *argv[])
{
	Seqlist*L=RequestSpace();
	if(L==NULL){
		printf("创建顺序表失败\n");
		return -1;
	}
	int number=0;
	printf("请输入插入多少不同种类的商品\n");
	scanf("%d",&number);
//2,实现顺序表数据元素在表尾录入
	TrialSeqlist(L,number);
#if 0
	//3,实现顺序表输出
	OutPutSeqlist(L);
//4.实现顺序表按下标插入商品信息
	int index=0;
	printf("请输入插入的下标\n");
	scanf("%d",&index);
	InserIndexBydata(L,index);

	int index1=0;
	printf("请输入删除的下标\n");
	scanf("%d",&index1);
	DelByGood(L,index1);
	//3,实现顺序表输出
	OutPutSeqlist(L);

	char key[20]="";
	printf("输入查找的商品名称\n");
	scanf("%s",key);
	int *p=FindName(L,key);
	for(int i=0;i<10;i++){
		if(*(p+i)==-1){
			continue;
		}
		printf("在下标%d出现\n",*(p+i));
	}

	//7,修改商品名称key的购买数量,修改为n
	int n=0;
	char key2[20]="";
	printf("输入要修改商品的名称\n");
	scanf("%s",key2);
	printf("输入修改的商品的购买数量\n");
	scanf("%d",&n);
	ModifyGoodsBynameBysum(L,key2,n);
	//3,实现顺序表输出
	OutPutSeqlist(L);

//8,删除最贵的商品信息
	ptintf("删除最贵的商品信息\n");
	DelExpensiveBygood(L);
	//3,实现顺序表输出
	OutPutSeqlist(L);

	//9,对商品总价实现升序排序
	printf("根据价格排序\n");
	SortPrice(L);
	//3,实现顺序表输出
	OutPutSeqlist(L);

	//10,如果有两个商品名称相同的商品信息.则去重
	printf("删除商品名称相同的商品信息:\n");
	RemovSame(L);
	//3,实现顺序表输出
	OutPutSeqlist(L);

	//11,释放堆区空间*/
	printf("释放堆区空间\n");
	FreeSpace(&L);
	if(L==NULL){
		printf("释放成功\n");
	}
	else{
		printf("释放失败\n");
	}
	return 0;
}
#include"SchoopCarSqelist.h"
//1.在堆区申请空间
Seqlist* RequestSpace()
{
	Seqlist*p=(Seqlist*)malloc(sizeof(Seqlist));
	if(p==NULL){
		printf("申请空间失败\n");
		return NULL;
	}
	p->len=0;
	return p;
}
//2,实现顺序表数据元素在表尾录入
void TrialSeqlist(Seqlist*L,int number)
{
	for(int i=0;i<number;i++){
		printf("名称:\n");
		scanf("%s",L->data[i].name);
		printf("属性:\n");
		scanf("%s",L->data[i].arrriture);
		printf("价格:\n");
		scanf("%f",&L->data[i].price);
		printf("输入商品的个数\n");
		scanf("%d",&L->data[i].num);
		L->len++;
	}
}
//3,实现顺序表输出
void OutPutSeqlist(Seqlist*L)
{
	for(int i=0;i<L->len;i++){
		printf("名称%s\t属性%s\t价格%.1f\t个数%d\n",L->data[i].name,L->data[i].arrriture,L->data[i].price,L->data[i].num);
	}
}
//顺序表判空
//0表示空了,-1表示没空;
int EmptySeqlist(Seqlist*L)
{
	return 0==L->len?0:-1;
}
//顺序表判满
//0表示满了,-1表示没满;
int FullSeqlist(Seqlist*L)
{
	return L->len==MAXSIZE?0:-1;
}
//4.实现顺序表按下标插入商品信息
int InserIndexBydata(Seqlist*L,int index)
{
	if(index<0||index>L->len){
		printf("输入的下表位置非法\n");
		return -1;
	}
	int i=0;
	if(FullSeqlist!=0){
		for(i=L->len;i>index;i--){
			L->data[i]=L->data[i-1];
		}
	}
	printf("输入插入商品的信息\n");
	printf("名称:\n");
	scanf("%s",L->data[i].name);
	printf("属性:\n");
	scanf("%s",L->data[i].arrriture);
	printf("价格:\n");
	scanf("%f",&L->data[i].price);
	printf("输入商品的个数\n");
	scanf("%d",&L->data[i].num);
	L->len++;
	return 0;
}
//5,实现顺序表按下标删除商品信息
int DelByGood(Seqlist*L,int index)
{
	if(index<0||index>L->len){
		printf("输入的位置参数非法\n");
		return -1;
	}
	if(EmptySeqlist==0){
		printf("空表,无需删除\n");
		return -1;
	}
	int i=0;
	for(i=index;i<L->len;i++){
		L->data[i]=L->data[i+1];
	}
	L->len--;
	return 0;
}
//6,查找商品名称key是否在购物车信息中出现
int* FindName(Seqlist*L,char key[])
{
	static int arr[10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
	int k=0;
	if(EmptySeqlist==0){
		printf("空表,无需查找\n");
		return NULL;
	}
	for(int i=0;i<L->len;i++){
		if(strcmp(L->data[i].name,key)==0){
				arr[k++]=i;
		}
	}
	if(k==0){
		printf("购物车没有此商品\n");
	}
	return arr;
}
//7,修改商品名称key的购买数量,修改为n;
int ModifyGoodsBynameBysum(Seqlist*L,char key[],int n)
{
	if(EmptySeqlist==0){
		printf("空表,无需查找\n");
		return -1;
	}
	int *p=FindName(L,key);
	for(int i=0;i<10;i++){
		if(*(p+i)==-1){
			continue;
		}
		L->data[i].num=n;
	}
	return 0;

}
//8,删除最贵的商品信息
int DelExpensiveBygood(Seqlist*L)
{
	if(EmptySeqlist==0){
		printf("空表,无需查找\n");
		return -1;
	}
	int max_index=0;
	int max=L->data[0].price;
	for(int i=1;i<L->len;i++){
		if(max<L->data[i].price){
			max_index=i;
		}
	}
	DelByGood(L,max_index);
	L->len--;
}

//9,对商品总价实现升序排序
void SortPrice(Seqlist*L)
{
	for(int i=1;i<L->len;i++){
		for(int j=0;j<L->len-i;j++){
			if(L->data[j].price>L->data[j+1].price){
				Goods temp=L->data[j];
				L->data[j]=L->data[j+1];
				L->data[j+1]=temp;
			}
		}
	}
}
//10,如果有两个商品名称相同的商品信息.则去重
void RemovSame(Seqlist*L)
{
	for(int i=0;i<L->len;i++){
		for(int j=i+1;j<L->len;j++){
			if(strcmp(L->data[i].name,L->data[j].name)==0){
				DelByGood(L,i);
				j--;
			}
		}
	}
}
//11,释放堆区空间*/
void FreeSpace(Seqlist**L)
{
	free(*L);
	*L=NULL;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值