提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
请求
俺是俺是你们的学长,点点关注点点赞就可以了,制作不容易,非常感谢!!!!
有问题,私信,评论都可以,我在学校每天晚上都会回复你们,一起加油
前言
线性表子系统,包括两个模块链式储存结构以及线性储存结构,我将一一的列举出代码以及注解,喜欢的点击关注三连,我是你们的学长
一、实验目的
实验目的:
1.掌握线性表的特点。
2.掌握线性表顺序存储结构和链式存储结构的基本运算。
3.掌握线性表的穿件、插入、删除和显示线性表中元素等基本操作。
二、实验步骤
1.线性存储结构
采用顺序存储结构,完成以下操作
1.建立线性表,保存表元素{A,B,C,D,F,E}
2.插入表元素;
3.删除表元素;
4.查找表元素;
5.求表长;
6.显示表元素;
上述操作以下菜单交互操作。
详细思路
1,建表思路
调用Greatlist函数建立表头完成顺序表的初始化,同时将需要输入的数据通过调用BuildList函数将数据存入到已经规划好空间的数组中
通过以下操作完成数据的插入
for (i = 0;;i++)//简历循环
{
Printf(“输入数据:“);
scanf (“%c”,&L->data[i]);//将数据输入存储的数组中
getchar ();//缓冲
if (L->data[i] == ‘0’)//判断停止的条件
break;//跳出循环
L->last++; //最后指向的节点数加一
}
2,插入数据
首先判断存入的数据是否已经填满了静态数组,将节点指向的最后位置与定义的静态存储空间大小相比较,判断是否可以插入,同时根据插入的位置判断是否合理
将插入位置后面的数组元素集体往后移动一个量级,将需要插入的数据填入,,将指向的最后一个节点加一
for (j = L->last+1;j > i-1;j–)
L->data[j] = L->data[j-1];//表格后移动
L->data[i-1] = d;//插入数据
L->last++;//将线性表的最大储存值加一
printf (“插入成功!\n”);
return 1;
3,显示数据
将建立的线性表通过指针挨个输出,调用PrintfList函数输出
printf (“\n表中的数据为:\n”);
for (i = 0;i <= L->last;i++)
printf (“%c “,L->data[i]);
printf (”\n”);
4 ,删除数据
删除数据按它在线性表中的位置进行删除,首先判断它是否删除位置合理,合理的话便将其所在位置下一个数据移动至上一个元素中,往依次类推,直至到达最后一个数据所在的位置
for (j = i;j <= L->last;j++)
L->data[j-1] = L->data[j];
L->last–;
printf (“删除成功!\n”);
5,查找数据
按数值查找,输入要查找的数值开始从头结点开始查找,判断是否是已经存入的数据,若遍历数组完成还是没找到数据怎返回-1最后通过主函数输出未找到
找到的数据输出其所在的位置
6求表长
通过判断最后的指向数组值在加一就可以确定表的长度
代码如下(示例):
#define MAXSIZE 100
#include<stdio.h>
#include<stdlib.h>
typedef char datatype;
typedef struct
{
datatype data[MAXSIZE];
int last;
}SeqList;
void Menu (); //显示菜单
SeqList *CreatList (); //初始化顺序表
void BuildList (SeqList *L); //将元素保存到表中
int InsList (SeqList *L,int i,datatype d); //插入表元素
int DeleteList (SeqList *L,int i); //删除表元素
void PrintList (SeqList *L); //输出表内容
int SearchList (SeqList *L,char d); //查找表元素
int LengthList (SeqList *L); //求顺序表的当前长度
int main ()
{
SeqList *L; //L表示顺序表的首地址
int i,input,result; //i表示插入的位置,input为输入的选择,result表示返回的值
int control = 1; //控制是否退出程序
char d; //d表示将插入的元素
while (control)
{
system ("cls"); //清屏
Menu ();
printf ("\t\t请输入你的选择:");
scanf ("%d",&input);
getchar (); //缓冲回车
switch (input)
{
case 1:
L = CreatList ();
BuildList (L);
break;
case 2:
printf ("\n输入插入元素的位置:");
scanf ("%d",&i);
getchar ();
printf ("输入插入元素的值:");
scanf ("%c",&d);
InsList (L,i,d);
break;
case 3:
printf ("\n请输入删除元素的位置:");
scanf ("%d",&i);
DeleteList (L,i);
break;
case 4:
PrintList (L);
printf ("\n");
break;
case 5:
printf ("\n请输入要寻找的数据:");
scanf ("%c",&d);
result = SearchList (L,d);
if (result == -1)
printf ("未找到该元素!\n");
else
printf ("该元素的位置为%d\n",result+1);
break;
case 6:
printf ("\n当前表的长度为:%d\n",LengthList(L)+1);
break;
case 7:
control = 0;
break;
default:
printf ("\n输入的选项有误,请重新输入!\n");
break;
}
if (input != 7)
system ("pause"); //程序暂停
}
return 0;
}
void Menu ()
{
printf ("\n\n\t\t____________________________________________\n");
printf ("\t\t| 线性表子系统 |\n");
printf ("\t\t^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^\n");
printf ("\t\t| 1----建 表 |\n");
printf ("\t\t| 2----插 入 |\n");
printf ("\t\t| 3----删 除 |\n");
printf ("\t\t| 4----显 示 |\n");
printf ("\t\t| 5----查 找 |\n");
printf ("\t\t| 6----求 表 长 |\n");
printf ("\t\t| 7----返 回 |\n");
printf ("\t\t********************************************\n");
}
SeqList *CreatList ()
{
SeqList *L;
L = (SeqList *)malloc (sizeof (SeqList));
L->last = -1;
return L;
}
void BuildList (SeqList *L)
{
int i;
printf ("\n(输入数据为0时结束输入)\n");
for (i = 0;;i++)
{
printf ("输入数据:");
scanf ("%c",&L->data[i]);
getchar ();
if (L->data[i] == '0')
break;
L->last++;
}
printf ("\n创建成功!\n");
}
int InsList (SeqList *L,int i,datatype d)
{
int j;
if (L->last == MAXSIZE-1)
{
printf ("顺序表已满!\n");
return -1;
}
if (i < 1 || i > L->last+1)
{
printf ("位置出错!\n");
return 0;
}
for (j = L->last+1;j > i-1;j--)
L->data[j] = L->data[j-1];
L->data[i-1] = d;
L->last++;
printf ("插入成功!\n");
return 1;
}
int DeleteList (SeqList *L,int i)
{
int j;
if (i < 1 || i > L->last+1)
{
printf ("位置出错!\n");
return 0;
}
for (j = i;j <= L->last;j++)
L->data[j-1] = L->data[j];
L->last--;
printf ("删除成功!\n");
return 1;
}
void PrintList (SeqList *L)
{
int i;
printf ("\n表中的数据为:\n");
for (i = 0;i <= L->last;i++)
printf ("%c ",L->data[i]);
printf ("\n");
}
int SearchList (SeqList *L,char d)
{
int i = 0;
while (i <= L->last && L->data[i] != d)
i++;
if (i > L->last)
return -1;
else
return i;
}
int LengthList (SeqList *L)
{
return L->last;
}
2.链式存储结构
详细思路
1,建立链表
通过调用CreateList函数还建立链表,采用头插法来建立链表,
同时初始化初链表
2,插入数据
首先判断存入的数据是否已经填满了静态数组,将节点指向的最后位置与定义的静态存储空间大小相比较,判断是否可以插入,同时根据插入的位置判断是否合理
通过确定出入的位置,将线性表的位置确定,通过位置插入法,将得到的数据插入到线性表中
3,显示
调用线性表通过指针挨个输出,调用PrintfList函数输出
4,删除
删除数据按它在线性表中的位置进行删除,首先判断它是否删除位置合理,合理的话便将其所在位置下一个数据移动至上一个元素中,往依次类推,直至到达最后一个数据所在的位置
5,求表长
通过判断最后的指向数组值在加一就可以确定表的长度
完整代码如下(示例):
#include<stdio.h>
#include<malloc.h>
typedef struct linknode
{
char data;
struct linknode *next;
}linnode;
linnode *head;
int n;
void CreateList()
{
linnode *p, *s;
int z;
char x;
n=0;
z=1;
head=(linnode *)malloc(sizeof(linnode)) ;
p=head;
printf("\n\t\t请逐个输入节点,以'x'为结束标记!\n");
printf("\n");
while(z)
{
printf("\t\t输入一个字符数据,并按回车: ");
scanf("%c", &x);
getchar();
if(x!='x')
{
s= (linnode *)malloc(sizeof(linnode));
n++;
s->data=x;
p->next=s;
s->next=NULL;
p=s;
}
else z=0;
}
}
void InsList(int i,char x)
{
linnode *s, *p;
int j;
p=head;
j=0;
while (p!=NULL&&j<i)
{
j++;
p=p->next;
}
if(p!=NULL)
{
s=(linnode *)malloc(sizeof(linnode));
s->data=x;
s->next=p->next;
p->next=s;
n++;
}
else printf("\n\t\t线性表为空或插入位置超出!\n");
}
void DelList(char x)
{
linnode *p,*q;
if (head==NULL)
{
printf("\n\t\t链表下溢!");
return;
}
if(head->next==NULL)
{
printf("\n\t\t线性表已空!");
return;
}
q=head;
p=head->next;
while(p!=NULL&&p->data!=x)
{
q=p;
p=p->next;
}
if(p!=NULL)
{
q->next=p->next;
free(p);
n--;
printf("\n\t\t结点%c 已经被删除!",x);
}
else printf("\n\t\t抱歉!没有找到您要删除的结点.");
}
void ShowList()
{
linnode *p=head;
printf("\n\t\t显示线性表的所有元素:");
if(head->next==NULL||p==NULL)
printf("\n\t\t链表为空! ");
else
{
printf("\n\t\t");
while (p->next!=NULL)
{
printf("%5c",p->next->data);
p=p->next;
}
}
}
void SearchList(char x)
{
linnode *p;
int i=1;
if (head==NULL)
{
printf("\n\t\t链表下溢!");
return;
}
if (head->next==NULL)
{
printf("\n\t\t线性表为空,没有任何结点!");
return;
}
p=head->next;
while(p!=NULL&&p->data!=x)
{
p=p->next;
i++;
}
if(p!=NULL)
printf("\n\t\t在表的第%d位上找到值为%c的结点!",i,x);
else
printf("\n\t\t抱歉!未找到值为%c的结点!",x);
}
int main()
{
int choice,i,j;
char x;
head=NULL;
j=1;
while(j)
{
printf("\n");
printf("\n\t\t****************************");
printf("\n\t\t* 线性表子系统 *");
printf("\n\t\t****************************");
printf("\n\t\t* 1-----建 表 *");
printf("\n\t\t* 2-----插 入 *");
printf("\n\t\t* 3-----刪 除 *");
printf("\n\t\t* 4-----显 示 *");
printf("\n\t\t* 5-----査 找 *");
printf("\n\t\t* 6-----求表长 *");
printf("\n\t\t* 0-----返 回 *");
printf("\n\t\t****************************");
printf("\n\t\t 请选择菜単号 (0--6): ");
scanf("%d",&choice);
getchar();
if(choice==1)
CreateList();
else
if(choice==2)
{
printf("\n\t\t请输入插入的位置i和插入的数据(输入格式:i,x)");
scanf("%d,%c",&i,&x);
InsList(i,x);
}
else
if(choice==3)
{
printf("\n\t\t请输入要刪除的数值:");
scanf("%c",&x);
DelList(x);
}
else
if(choice==4)
{
if(head==NULL)
printf("\n\t\t请先建立线性表!");
else
ShowList();
}
else
if(choice==5)
{
printf("\n\t\t请输入要查找的元素:");
scanf("%c",&x);
SearchList(x);
}
else
if(choice==6)
printf("\n\t\t线性表长度为: %d",n);
else
if(choice==0)
j=0;
else
printf("\n\t\t输入错误!请重新输入!");
}
}
C语言代码
总结
提示:建议结合数据结构课本一起学习
俺是你们的学长,点点关注就可以了,制作不容易,非常感谢!!!!!