c语言描述顺序表的插入算法,数据结构 (一)顺序表&链表实现

本文通过详细步骤指导如何使用C语言实现顺序表和单链表的基本操作,包括构造顺序表、插入记录、查找特定元素、删除指定项以及合并链表。通过实例演示了如何将算法转换为代码,并探讨了顺序表和链表的不同特性和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、实验目的

(1)熟悉将算法转换为程序代码的过程。

(2)了解顺序表的逻辑结构特性,熟练掌握顺序表存储结构的C语言描述方法。

(3)熟练掌握顺序表的基本运算:查找、插入、删除等,掌握顺序表的随机存取特性。

(4)了解线性表的链式存储结构,熟练掌握线性表的链式存储结构的C语言描述方法。

(5)熟练掌握线性链表(单链表)的基本运算:查找、插入、删除等,能在实际应用中灵活选择适当的链表结构。

2、实验内容

(1)操作顺序表

1)   用实验一的原始数据构造一顺序表,命名为 gradeList

2)   向 gradeList 中插入如下记录:

张兰, 85, 77, 92

注意:此记录应该插入为gradeList的第7条记录上。

3)   搜寻 gradeList,找到第12条记录

4)   搜寻 gradeList,找到“令狐冲”的所有成绩。

5)   删除 gradeList 中 “岳不群”的成绩记录。

(2) 操作链表

建立两个整数单链表,命名为LA 和 LB, 分别含有如下整数:

LA: 78, 64, 37, 30, 29, 24, 18, 12, 9, 2

LB: 93, 82, 73, 65, 44, 35, 31, 28, 26, 17, 15

编制一程序将LA与LB合并成新的链表LC, LC的数据仍然要保持降序;然后将LC的数据输出到屏幕上,并在其后显示LC的长度。然后完成如下操作:

(1)找到LC中元素65的位置并显示在屏幕上

(2)删除LC中的如下值:82,73,64,29

(3)显示上一步操作完成后LC的数据。

(4)再向LC中插入数55,43;然后屏幕显示LC中所有数据。

3、实验要求:

(1)实验报告中需要显示所建立的抽象数据模型。

(2)每个功能需要编制一专门的函数实现其功能:

例如: 建立函数 CreateLA()实现建立 单向链表LA;

建立函数  MergeLists() 实现合并LA与LB

等的。

(3)将程序运行结果截图写入实验报告。

(4)实验需要在两周内按时完成。

#include#include#include#define Addsize 5

typedef struct{

/*定义结点结构体*/

char name[10];

int analysis;

int algebra;

int anaGeo;

}student;

typedef struct{

/*定义顺序表结构体*/

//这个结构体包含一个顺序表所具有的三个基本信息;

student *elem;//顺序表的首地址;

int length;//顺序表的有效数据长度;

int listsize;//顺序表所占系统分配的内存空间;

}gradeList;

void Initlist(gradeList&L);

void file_to_stu(FILE*fp,student*stu);

void Add(gradeList&L,student stu);

void show_all(gradeList &L);

void search_stu(gradeList&L,char *info);

void search_num(gradeList&L,int num);

void delete_stu(gradeList&L,char *info);

int Insert(gradeList&L,student stu,int e);

int main(){

gradeList L;//定义一个顺序表变量L;

Initlist(L);//初始化L;

student stu[14];//定义一个学生结构体数组stu;

char info[10];

FILE *fp;

file_to_stu(fp,stu);

for(int i=0;i<14;i++){

//将结构体数组stu中的14个学生信息加到顺序表L中;

Add(L,stu[i]);

}

//题目2:向 gradeList中插入如下记录:"张兰, 85,77,92"此记录插入7条记录上

student stu1={"张兰",85,77,92};

Insert(L,stu1,7);

//题目3:搜寻 gradeList,找到第12条记录

search_num(L,12);

//题目4:搜寻 gradeList,找到"令狐冲"的所有成绩。

strcpy(info,"令狐冲");

search_stu(L,info);

//题目5:删除 gradeList 中 "岳不群"的成绩记录

strcpy(info,"岳不群");

delete_stu(L,info);

show_all(L);

return 0;

}

void Initlist(gradeList&L){//init既是initialize(初始化)的缩写词;

/*初始化顺序表L*/

L.elem=(student*)malloc(20*sizeof(student));

if(!L.elem)exit(1);//判断是否初始化成功;

L.length=0;//因为初始化的顺序表无有效数据故为0;

L.listsize=20;//此时顺序表L所占系统分配内存为20(个student结构体);

}

void Add (gradeList&L,student stu){

/*这个函数实现将一个学生结构体加到顺序表的最尾端

是为了实现一开始将14个学生信息加到顺序表而用的*/

L.length++;//每次增加一个学生信息,顺序表L的有效数据长度就加一;

L.elem[L.length-1]=stu;//让顺序表L的最后一个位置加上要等于增加的学生结构体;

}

int Insert (gradeList&L,student stu,int e){

/*实现在顺序表的e位置插入学生结构体stu的功能,参考书里22页的代码*/

student *newbase;//用于指向新的分配内存的指针;

student *p=NULL,*q=NULL;

if(L.length+1=L.listsize){

//当前分配的空间不够用,增加分配;

newbase=(student*)realloc(L.elem,(L.listsize+Addsize)*sizeof(student));

if(!newbase){

printf("分配新空间失败!");

exit(1);

}

L.elem=newbase;//让原来顺序表L的成员指针指向新分配的空间;

L.listsize+=Addsize; //顺序表L的占用分配空间要记得加上新增的空间;

}

q=&(L.elem[e-1]);//让指针q先指向所要插入的位置地址;

for(p=&(L.elem[L.length-1]);p>=q;--p){

//从最后一个结构体依次往后退到第e-1个位置为止;

*(p+1)=*p;

}

*q=stu;//让刚刚指向第e个为止的指针q的元素值等于stu

L.length++;//因为插入一个新的结构体,所以有效长度要加一;

return 1;

}

void show_all(gradeList &L){

/*将顺序表L的所有有效数据打印在屏幕上*/

for(int i=0;i

链表

#include#include#includeusing namespace std;

/*构造结构体结点*/

typedef struct data{

int num;

data*next;

}Data;

Data *CreatL(int*a,int size);

void view_list(Data*L);

void view_length(Data*L);

int output_length(Data*L);

void view_location(Data *L,int a);

void delete_num(Data*L,int a);

void Insert(Data*L,int a);

Data * MergeLists(Data*LA,Data*LB);

int main(){

int a[]={78, 64, 37, 30, 29, 24, 18, 12, 9, 2};

int b[]={93, 82, 73, 65, 44, 35, 31, 28, 26, 17, 15};

Data*LA=CreatL(a,10);

Data*LB=CreatL(b,11);

Data*LC=MergeLists(LA,LB);

//(1)找到LC中元素65的位置并显示在屏幕上

view_location(LC,65);

//(2)删除LC中的如下值:82,73,64,29;

delete_num(LC,82);

delete_num(LC,73);

delete_num(LC,64);

delete_num(LC,29);

//(3)显示上一步操作完成后LC的数据。

view_list(LC);

//(4)再向LC中插入数55,43;然后屏幕显示LC中所有数据。

Insert(LC,55);

Insert(LC,43);

view_list(LC);

return 0;

}

Data *CreatL(int*a,int size){

Data*head=(Data*)malloc(sizeof(Data));

head->num=0;

head->next=NULL;

Data *p=head,*q;

q=p;

for(int i=0;inum=a[i];

q->next=p;

q=p;

}p->next=NULL;

return head;

}

void view_list(Data*L){

Data*p=L;

while(p->next){

p=p->next;

cout

p=p->next;

i++;

}

cout

p=p->next;

i++;

}

return i;

}

void view_location(Data *L,int a){

Data*p=L;

int i=0;

while((p->num!=a)&&(p->next!=NULL)){

p=p->next;

if(p->num==a)

cout

p=p->next;

if(p->num==a){

q->next=p->next;

free(p);break;

}

q=p;

}

if(!p->next)cout

p=p->next;

if((p->num)<=a){

ptemp=(Data*)malloc(sizeof(Data));

ptemp->num=a;

ptemp->next=p;

q->next=ptemp;

break;

}

q=p;

i++;

}

if(i==output_length(L)){

ptemp=(Data*)malloc(sizeof(Data));

ptemp->next=NULL;

ptemp->num=a;

p->next=ptemp;

}

}

Data * MergeLists(Data*LA,Data*LB){

Data *LC=LB;

Data *p1=LA->next;

Data *p2=p1;

while(p2->next){

p2=p1;

Insert(LB,p1->num);

p1=p1->next;

}

return LC;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值