一、 实验目的
- 掌握单链表的存储结构特点
- 掌握单链表中的各种基本运算算法设计。
二、 实验内容与要求
编写一个程序exp2-2.cpp,实现单链表的各种基本运算和下面main函数中的每一步功能。
- 初始化单链表L;
- 依次采用尾插法插入’a’,’b’,’c’,’d’,’e’五个字符元素;
- 输出单链表L;
- 依次采用头插法插入’1’,’2’,’3’三个字符元素;
- 输出单链表L;
- 输出单链表L中序号为3的元素。(元素序号从1开始);
- 输出元素’a’在链表中的位置(即序号);
- 在第4个元素位置上插入’*’元素;
- 输出单链表L
- 删除L中第3个元素;
- 输出单链表L
三、 实验步骤
1.单链表结点类型声明:
typedef char ElemType;
typedef struct LNode {
ElemType data;
struct LNode *next;
} SqList;
2.线性表基本运算在单链表上的实现
void InitList(SqList *&L) {
L= (SqList *)malloc(sizeof(SqList)); //分配存放线性表的空间
L->next=NULL; //置空线性表长度为0
}
void DestroyList(SqList *&L) { //销毁线性表(DestroyList)
SqList *pre=L,*p=L->next;
while(p!=NULL) {
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}
void DispList(SqList *L) { //输出线性表,
SqList *p=L->next;
while(p!=NULL) {
printf("%c ",p->data);
p=p->next;
}
printf("\n");
}
bool GetElem(SqList *L,int i,ElemType &e) {
int j=0;
SqList *p=L;
if(i<=0)
return false;
while(j<i&&p!=NULL) {
j++;
p=p->next;
}
if(p==NULL)
return false;
else {
e=p->data;
return true;
}
}
int LocateElem(SqList *L,ElemType e) {
int i=1;
SqList *p=L->next;
while(p!=NULL&&p->data!=e) {
p=p->next;
i++;
}
if(p==NULL)
return (0);
else
return (i);
}
void CreateListR(SqList *&L,ElemType a[],int n) {
SqList *s,*r;
L= (SqList *)malloc(sizeof(SqList));
r=L;
for(int i=0; i<n; i++) {
s=(SqList *)malloc(sizeof(SqList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
bool ListInsert(SqList *L,int i,ElemType e) { //插入数据元素;
int j=0;
SqList *p=L,*s;
if(i<=0)
return false;
while(j<i-1&&p!=NULL) {
j++;
p=p->next;
}
if(p==NULL)
return false;
else {
s=(SqList *)malloc(sizeof(SqList));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
}
bool ListDelete(SqList *&L,int i,ElemType &e) { //删除数据元素;
int j=0;
SqList *p=L,*q;
if(i<=0)
return false;
while(j<i-1&&p!=NULL) {
j++;
p=p->next;
}
if(p==NULL)
return false;
else {
q=p->next;
if(q==NULL)
return false;
e=q->data;
p->next=q->next;
free(q);
return true;
}
}
void CreateListF(SqList *&L, ElemType b[], int n) { //头插法
SqList * s;
L = (SqList *)malloc(sizeof(SqList)); //创建头节点
L->next = NULL;
for(int i = 0;
i < n; i++){
s = (SqList *)malloc(sizeof(SqList));//创建新节点s
s->data = b[i];
s->next = L->next; //将节点s插在开始接点之前,头节点之后
L->next = s;
}
}
void DispList2(SqList *L){
SqList *p = L->next; //p指向首节点
while(p != NULL){ //p不为NULL,输出p节点的data
printf("%d ", p->data);
p = p->next; //p移向下一个节点
}
printf("\n");
}
3. 程序exp2-2.cpp的设计,及完成实验要求中的功能
(补齐实现对应功能的代码 )
// 1) 初始化顺序表L。
//2) 依次插入a,b,c,d,e元素,字符类型
//3) 输出顺序表L
//4) 输出顺序表L的长度
//5) 判断顺序表L是否为空
//6) 输出顺序表L的第3个元素
//7) 输出元素a的位置
//8) 在第4个元素位置上插入f元素
/9) 输出顺序表L
//10) 删除顺序表L的第3个元素
//11) 输出顺序表L
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef char ElemType;
typedef struct LNode {
ElemType data;
struct LNode *next;
} SqList;
void InitList(SqList *&L) {
L= (SqList *)malloc(sizeof(SqList)); //分配存放线性表的空间
L->next=NULL; //置空线性表长度为0
}
void DestroyList(SqList *&L) { //销毁线性表(DestroyList)
SqList *pre=L,*p=L->next;
while(p!=NULL) {
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}
void DispList(SqList *L) { //输出线性表,
SqList *p=L->next;
while(p!=NULL) {
printf("%c ",p->data);
p=p->next;
}
printf("\n");
}
bool GetElem(SqList *L,int i,ElemType &e) {
int j=0;
SqList *p=L;
if(i<=0)
return false;
while(j<i&&p!=NULL) {
j++;
p=p->next;
}
if(p==NULL)
return false;
else {
e=p->data;
return true;
}
}
int LocateElem(SqList *L,ElemType e) {
int i=1;
SqList *p=L->next;
while(p!=NULL&&p->data!=e) {
p=p->next;
i++;
}
if(p==NULL)
return (0);
else
return (i);
}
void CreateListR(SqList *&L,ElemType a[],int n) {
SqList *s,*r;
L= (SqList *)malloc(sizeof(SqList));
r=L;
for(int i=0; i<n; i++) {
s=(SqList *)malloc(sizeof(SqList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
bool ListInsert(SqList *L,int i,ElemType e) { //插入数据元素;
int j=0;
SqList *p=L,*s;
if(i<=0)
return false;
while(j<i-1&&p!=NULL) {
j++;
p=p->next;
}
if(p==NULL)
return false;
else {
s=(SqList *)malloc(sizeof(SqList));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
}
bool ListDelete(SqList *&L,int i,ElemType &e) { //删除数据元素;
int j=0;
SqList *p=L,*q;
if(i<=0)
return false;
while(j<i-1&&p!=NULL) {
j++;
p=p->next;
}
if(p==NULL)
return false;
else {
q=p->next;
if(q==NULL)
return false;
e=q->data;
p->next=q->next;
free(q);
return true;
}
}
void CreateListF(SqList *&L, ElemType b[], int n) { //头插法
SqList * s;
L = (SqList *)malloc(sizeof(SqList)); //创建头节点
L->next = NULL;
for(int i = 0;
i < n; i++){
s = (SqList *)malloc(sizeof(SqList));//创建新节点s
s->data = b[i];
s->next = L->next; //将节点s插在开始接点之前,头节点之后
L->next = s;
}
}
void DispList2(SqList *L){
SqList *p = L->next; //p指向首节点
while(p != NULL){ //p不为NULL,输出p节点的data
printf("%d ", p->data);
p = p->next; //p移向下一个节点
}
printf("\n");
}
int main()
{
ElemType e,a[5]={'a','b','c','d','e'},b[3]={1,2,3};
SqList *L;
printf("单链表的计算功能如下:\n");
printf(" 1.初始化单链表L\n");
InitList(L);
printf(" 2.依次采用尾插法插入a,b,c,d,e元素\n");
CreateListR(L,&a[0],5);
printf(" 3.输出单链表L: ");
DispList(L);
GetElem(L,3,e);
printf(" 6.输出单链表L的第3个元素 = % c\n",e);
printf(" 7.输出单链表中元素a的位置 = %d\n",LocateElem(L,'a'));
printf(" 8.在第4个元素位置上插入元素*\n");
ListInsert(L,4,'*');
printf(" 9.输出单链表L: ");
DispList(L);
printf(" 10.删除L的第3个元素\n");
ListDelete(L,3,e);
printf(" 11.输出单链表L: ");
DispList(L);
printf(" 4.依次采用头插法插入1,2,3元素\n");
CreateListF(L,&b[0],3);
printf(" 5.输出单链表L: ");
DispList2(L);
printf(" 12.释放单链表L\n");
DestroyList(L);
return 0;
}
四、编译运行结果截图:
如需源文件,请私信作者,无偿
标签:单链,return,int,next,数据结构,实验,SqList,printf,NULL From: https://blog.csdn.net/m0_65216733/article/details/137078147