初学者 c语言数据结构线性表的基本操作及应用
#### 实验报告: 线性表的基本操作及应用##### 实验内容
基本要求:
(1)实现单链表的创建;(2)实现单链表的插入;(3)实现单链表的删除
(4)实现单链表的查找;(5)实现单链表的显示;
```c
/*
Name:Linklist operation.cpp
Author:X
Date:2020/3/13
Description: 线性表的基本操作及应用
*/
#include<stdio.h>
#include<stdlib.h> //分配数据
#define ERROR 0;
#define OK 1;
typedef int ElemType;
typedef int status;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//建立线性表LA ,头插法
status CreatList_LA(LinkList &LA,int n)
{
LNode *p;int i;
LA=(LinkList)malloc(sizeof(LNode));
LA->next=NULL;
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=LA->next;
LA->next=p;
}
return OK;
}
//建立线性表LB
status CreakList_LB(LinkList &LB,int n)
{
LNode *p;status i;
LB=(LinkList)malloc(sizeof(LNode));
LB->next=NULL;
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=LB->next;
LB->next=p;
}
return OK;
}
//在第i个结点前插入e
status ListInsert_LA(LinkList &LA,status i,ElemType e)
{
LNode *p,*s; //等同于 LinkList p,s;
status j;
p=LA;j=0;
while(p&&j<i-1)
{
p=p->next;++j; //计数器
}
if(!p||j>i-1)
return ERROR;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
//删除第i个结点,值代入e
status ListDelete_LA(LinkList &LA,int i,ElemType &e)
{
LNode *p,*q;
status j;
p=LA;j=0;
while(p||j<i-1)
{p=p->next;++j;}
if(p->next==NULL||j>i-1)
returnERROR;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return OK;
}
//查找到第i个元素,用e返回
status GetElem_LA(LinkList LA,int i,ElemType e)
{
LNode *p;
p=LA;
status j;
j=0;
while(p&&j<i-1)
{p=p->next;++j;}
if(!p||j>i)
return ERROR;
e=p->data;
return OK;
}
//合并线性表LA和LB
status MergeList_L(LinkList &LA,LinkList &LB,LinkList &LC)
{
LNode *pa,*pb,*pc;
pa=LA->next;
pb=LB->next;
LC=pc=LA;
while(pa&&pb)
{
if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
pc->next=pa?pa:pb;
}
free(LB);
}
//输出链表
status printfList_L(LinkList &L)
{
LNode *p;
int i;
p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}
int main()
{
ElemType e ;
LinkList LA,LB,LC;
status i,n;
printf("输入向所创建LA链表中插入几个结点,n为:");
scanf("%d",&n);
printf("输入链表的结点数据:");
CreatList_LA(LA,n) ;
printf("输入向所创建LB链表中插入几个结点,n为:");
scanf("%d",&n);
printf("输入链表的结点数据:");
CreakList_LB(LB,n);
printf("输出链表LA为:");
printfList_L(LA);
printf("\n输出链表LB为:");
printfList_L(LB);
printf("\n输入在链表第几个位置插入结点,i,e为:");
scanf("%d%d",&i,&e);
ListInsert_LA(LA,i,e);
printf("\n插入后使出的链表为:");
printfList_L(LA);
printf("\n输入在链表第几个位置删除结点,i为:");
scanf("%d",&i);
ListDelete_LA(LA,i,e);
printf("\n删除后的链表LA为:");
printfList_L(LA);
printf("删除的第%d个结点所储存的元素为:%f",i,e);
printf("\n输入想查找第几个元素结点,i为:");
scanf("%d",&i);
GetElem_LA(LA,i,e);
printf("\n查找到的第i个元素为:");
printf("%d",e);
printf("\n合并之后的链表为:");
MergeList_L(LA,LB,LC);
printfList_L(LC);
return OK;
}
```
【记得引用符&与变量名称间有空格】
【定义的函数数据类型要与其中数据的数据类型一值】
第一次发东西,主要是怕删号 /*
Name:Linklist operation.cpp
Author:X
Date:2020/3/13
Description: 线性表的基本操作及应用
*/
#include<stdio.h>
#include<stdlib.h> //分配数据
#define ERROR 0;
#define OK 1;
typedef int ElemType;
typedef int status;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//建立线性表LA ,头插法
status CreatList_LA(LinkList &LA,int n)
{
LNode *p;int i;
LA=(LinkList)malloc(sizeof(LNode));
LA->next=NULL;
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=LA->next;
LA->next=p;
}
return OK;
}
//建立线性表LB
status CreakList_LB(LinkList &LB,int n)
{
LNode *p;status i;
LB=(LinkList)malloc(sizeof(LNode));
LB->next=NULL;
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=LB->next;
LB->next=p;
}
return OK;
}
//在第i个结点前插入e
status ListInsert_LA(LinkList &LA,status i,ElemType e)
{
LNode *p,*s; //等同于 LinkList p,s;
status j;
p=LA;j=0;
while(p&&j<i-1)
{
p=p->next;++j; //计数器
}
if(!p||j>i-1)
return ERROR;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
//删除第i个结点,值代入e
status ListDelete_LA(LinkList &LA,int i,ElemType &e)
{
LNode *p,*q;
status j;
p=LA;j=0;
while(p||j<i-1)
{p=p->next;++j;}
if(p->next==NULL||j>i-1)
returnERROR;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return OK;
}
//查找到第i个元素,用e返回
status GetElem_LA(LinkList LA,int i,ElemType e)
{
LNode *p;
p=LA;
status j;
j=0;
while(p&&j<i-1)
{p=p->next;++j;}
if(!p||j>i)
return ERROR;
e=p->data;
return OK;
}
//合并线性表LA和LB
status MergeList_L(LinkList &LA,LinkList &LB,LinkList &LC)
{
LNode *pa,*pb,*pc;
pa=LA->next;
pb=LB->next;
LC=pc=LA;
while(pa&&pb)
{
if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
pc->next=pa?pa:pb;
}
free(LB);
}
//输出链表
status printfList_L(LinkList &L)
{
LNode *p;
int i;
p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}
int main()
{
ElemType e ;
LinkList LA,LB,LC;
status i,n;
printf("输入向所创建LA链表中插入几个结点,n为:");
scanf("%d",&n);
printf("输入链表的结点数据:");
CreatList_LA(LA,n) ;
printf("输入向所创建LB链表中插入几个结点,n为:");
scanf("%d",&n);
printf("输入链表的结点数据:");
CreakList_LB(LB,n);
printf("输出链表LA为:");
printfList_L(LA);
printf("\n输出链表LB为:");
printfList_L(LB);
printf("\n输入在链表第几个位置插入结点,i,e为:");
scanf("%d%d",&i,&e);
ListInsert_LA(LA,i,e);
printf("\n插入后使出的链表为:");
printfList_L(LA);
printf("\n输入在链表第几个位置删除结点,i为:");
scanf("%d",&i);
ListDelete_LA(LA,i,e);
printf("\n删除后的链表LA为:");
printfList_L(LA);
printf("删除的第%d个结点所储存的元素为:%f",i,e);
printf("\n输入想查找第几个元素结点,i为:");
scanf("%d",&i);
GetElem_LA(LA,i,e);
printf("\n查找到的第i个元素为:");
printf("%d",e);
printf("\n合并之后的链表为:");
MergeList_L(LA,LB,LC);
printfList_L(LC);
return OK;
}
支持一下~~~ 0Ling0 发表于 2020-3-14 20:35
/*
Name:Linklist operation.cpp
Author:X
诶,我没找到插入c语言的模块的地方呢,我再找找看哈哈哈 牛逼,收藏了,刚好考试要要用到! 楼主 有的东西啊 我自己在写诸如此类的代码,不是这里错就是那里错,折磨之王 LJT1997 发表于 2020-3-27 01:07
牛逼,收藏了,刚好考试要要用到!
哈哈哈哈那还真是巧了,没想到第一次发就能被用到 宏定义那块的分号?? 可以再多多练习一下STL
页:
[1]