/*单向链表练习:
链表中存储数据类型为字符申,请完成以下功能
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;
Linklist*RequestSpace();
Linklist* CreatTrailNode();
Linklist* CreatNewNode();
void InsertTrail(Linklist*L,char value[]);
void InsertEnd(Linklist*L,char value[]);
void OutPutLinklist(Linklist *L);
void InsertPos(Linklist*L,int pos,char value[]);
void DelPos(Linklist*L,int pos);
void ModElement(Linklist*L,char value[],char value1[]);
void FindElement(Linklist*L,char value[]);
void RevLinklist(Linklist*L);
void SortLinklist(Linklist*L);
void FreeSpace(Linklist**L);
#endif
#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);
InsertEnd(L,arr);
}
OutPutLinklist(L);
#if 1
printf("任意位置插入\n");
int pos;
char value[20];
printf("输入要插入的位置\n");
scanf("%d",&pos);
printf("输入要插入的字符串\n");
scanf("%s",value);
InsertPos(L,pos,value);
OutPutLinklist(L);
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);
SortLinklist(L);
OutPutLinklist(L);
FreeSpace(&L);
if(L==NULL){
printf("释放成功\n");
}
else{
printf("释放空间失败\n");
}
#endif
return 0;
}
#include"link_list.h"
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;
}
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++;
}
void OutPutLinklist(Linklist *L)
{
Linklist*p=L;
for(int i=0;i<L->len;i++){
p=p->next;
printf("%s\t",p->data);
}
}
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++;
}
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--;
}
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");
}
}
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");
}
}
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;
}
}
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;
}
}
}
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;
Seqlist* RequestSpace();
void TrialSeqlist(Seqlist*L,int number);
void OutPutSeqlist(Seqlist*L);
int FullSeqlist(Seqlist*L);
int EmptySeqlist(Seqlist*L);
int InserIndexBydata(Seqlist*L,int index);
int DelByGood(Seqlist*L,int index);
int* FindName(Seqlist*L,char key[]);
int ModifyGoodsBynameBysum(Seqlist*L,char key[],int n);
int DelExpensiveBygood(Seqlist*L);
void SortPrice(Seqlist*L);
void RemovSame(Seqlist*L);
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);
TrialSeqlist(L,number);
#if 0
OutPutSeqlist(L);
int index=0;
printf("请输入插入的下标\n");
scanf("%d",&index);
InserIndexBydata(L,index);
int index1=0;
printf("请输入删除的下标\n");
scanf("%d",&index1);
DelByGood(L,index1);
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));
}
int n=0;
char key2[20]="";
printf("输入要修改商品的名称\n");
scanf("%s",key2);
printf("输入修改的商品的购买数量\n");
scanf("%d",&n);
ModifyGoodsBynameBysum(L,key2,n);
OutPutSeqlist(L);
ptintf("删除最贵的商品信息\n");
DelExpensiveBygood(L);
OutPutSeqlist(L);
printf("根据价格排序\n");
SortPrice(L);
OutPutSeqlist(L);
printf("删除商品名称相同的商品信息:\n");
RemovSame(L);
OutPutSeqlist(L);
printf("释放堆区空间\n");
FreeSpace(&L);
if(L==NULL){
printf("释放成功\n");
}
else{
printf("释放失败\n");
}
return 0;
}
#include"SchoopCarSqelist.h"
Seqlist* RequestSpace()
{
Seqlist*p=(Seqlist*)malloc(sizeof(Seqlist));
if(p==NULL){
printf("申请空间失败\n");
return NULL;
}
p->len=0;
return p;
}
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++;
}
}
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);
}
}
int EmptySeqlist(Seqlist*L)
{
return 0==L->len?0:-1;
}
int FullSeqlist(Seqlist*L)
{
return L->len==MAXSIZE?0:-1;
}
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;
}
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;
}
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;
}
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;
}
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--;
}
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;
}
}
}
}
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--;
}
}
}
}
void FreeSpace(Seqlist**L)
{
free(*L);
*L=NULL;
}