线性表的插入和删除C++程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
修改内容:重新排版
《数据结构》试验报告
-------------线性表的插入和删除
康一飞
地理信息系统08-2
08014208
一,实验目的
掌握线性表的顺序存储结构的定义及C语言实现插入,删除操作
掌握线性表的链式存储结构的定义及C语言实现插入,删除操作
二,实验内容
1定义
数据元素之间的关系在计算机中又两种不同的表示方式:顺序映像和非顺序映像,由此得到两种不同的存储结构:顺序存储结构和链式存储结构。
顺序映像的特点是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系
非顺序映像的特点是借助指针元素存储地址的指针表示数据元素之间的逻辑关系
2顺序表的插入
#include<stdio.h>
#include<malloc.h>
typedef struct
{
int elem;
int length;
int listsize;
}SqList,* SqL;
SqL CreateList_S()
{
int n;
SqList *p,*S;
S=(SqL) malloc (sizeof(SqList));
S->listsize=100;
printf("input the length of the list:");
scanf("%d",&(S->length));
printf("input the element of the list:");
for(n=1,p=S;n<=(S->length);n++,p+=sizeof(SqList)) scanf("%d",&p->elem);
return(S);
}
SqL ListInsert_S(SqL S)
{
int e,i,m,n;
loop: printf("input the place you want to insert:");
scanf("%d",&i);
if(i<1||i>S->length+1)
{
printf("ERROR input again\n");
goto loop;
}
printf("iuput the element you want to insert:");
scanf("%d",&e);
m=S->length;
for(n=i;n<=S->length;n++)
{
(S+m*sizeof(SqList))->elem=(S+(m-1)*sizeof(SqList))->elem;
m=m-1;
}
(S+(i-1)*sizeof(SqList))->elem=e;
S->length++;
return(S);
}
void main()
{
SqList *Sa,*p;
int n,i,e;
Sa=CreateList_S();
printf("the list is:");
for(n=1,p=Sa;n<=(Sa->length);n++,p+=sizeof(SqList))prin tf("%d ",p->elem);
printf("\n\n");
Sa= ListInsert_S(Sa);
printf("the list is:");
for(n=1,p=Sa;n<=(Sa->length);n++,p+=sizeof(SqList))prin tf("%d ",p->elem);
printf("\n");
}
3单链表的删除
#include<stdio.h>
#include<malloc.h>
#define NULL 0
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LiL;
LiL CreatList_L()
{
int i,n;
LNode *p,*L;
L=(LiL)malloc(sizeof(LNode));
L->next=NULL;
printf("please input the length of the list:");
scanf("%d",&n);
printf("input the element of the list:");
for(i=0;i<n;i++)
{
p=(LiL)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next,L->next=p;
}
return(L);
}
LiL ListDelete_L(LiL L)
{
LNode *p;
int j,e,i;
loop:printf("input the place you want to delited:");
scanf("%d",&i);
for(j=0, p=L;j<i-1&&p->next!=NULL;j++) p=p->next;
if(p->next==NULL)
{
printf("ERROR input again\n");
goto loop;
}
e=p->next->data;
p->next=p->next->next;
printf("the element you want to delited is:%d\n",e);
return(L);
}
void main()
{
LNode *La,*p;
int n,i,e;
La=CreatList_L();
printf("the list is:");
for(p=La->next;p!=NULL;p=p->next)printf("%d ",p->data);
printf("\n\n");
La= ListDelete_L(La);
printf("the list is:");
for(p=La->next;p!=NULL;p=p->next)printf("%d ",p->data);
printf("\n");
}
三、实验体会
1,由于《数据结构》课本上给出的示例函数并不是完全由C语言写出,包含了一些伪代码,所以不可以直接拿来使用,一定要结合具体的程序设计实际例题用严格的C语言编写出才能通过编译2. 程序中用了大量的指针,在定义和使用它时要分清楚哪些是代
表指针,哪些是代表指针所指向的地址,以及哪些是其他的类型,我在编程中就因为没有把握好这几种类型,耗费了许多时间来检查错误
3. 在调用和创建函数时,注意函数使用的各种规则,注意函数类
型和返回值,参见C语言课本
4. 编写两个程序时,要注意两种存储结构的线性表的不同,不要
把二者的一些东西混淆
5 一些小细节,比如:单链表输出时令p=La->next,而不是
p=La;以及程序中作为计数器使用的一些int型变量的起始值,可能以为一个数的差别导致程序运行错误,要反复检查实验才能得到正确结果
6 由于能力有限,除了“插入/删除位置有误”外,没有对其他
复杂情况分析,值编写了简单的数字线性表的操作
康一飞
地理信息系统08-2班 08014208。