以下为本人大学期间某上机作业,分享给大家,如有不足欢迎指出!
目录
实验三 线性表的基本操作
实验要求
定义一个顺序的线性表,命名为Seq_List,实现如下操作:
序号 | 函数 | 功能 | 输入输出要求 |
| Length(L) | 求线性表长 | 输入——顺序表L 输出——顺序表表长(即表中元素个数) |
| Get(L,i) | 获取线性表第i个元素值 | 输入——顺序表L和位置i(1≤i≤n,n为表长) 输出——顺序表L中第i个元素的值 |
| Locate(L,x) | 在线性表中查找值为x的元素 | 输入——顺序表L和元素值x 输出——x在顺序表L中的位置,若不存在输出-1 |
| Insert(L,i,x) | 在线性表中第i个位置插入值为x的元素 | 输入——顺序表L,位置i和元素值x 输出——插入成功返回1,失败返回0 |
| Delete(L,i) | 在线性表中删除第i个元素 | 输入——顺序表L和位置i 输出——删除成功返回1,失败返回0 |
| IsEmpty(L) | 判断线性表是否为空表 | 输入——顺序表L 输出——顺序表L为空返回True,否则返回False |
| Traverse(L) | 遍历线性表L | 输入——顺序表L 输出——顺序表所有元素 |
源码
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int ElemType;
typedef struct{
ElemType data[MAXSIZE];
int length;
}Seq_List;
Seq_List *InitList(Seq_List *L);// 0.初始化线性表,返回头指针
int Length(Seq_List *L);// 1.求线性表长
int Get(Seq_List *L, int i, ElemType *e);// 2.获取第i个元素
int Locate(Seq_List *L, ElemType e);//3.定位值为e的位置
int Insert(Seq_List *L, int i, ElemType e);//4. 插入元素
int Delete(Seq_List *L, int i);// 5. 删除第i个元素
int IsEmpty(Seq_List *L);// 6.判断线性表是否为空表
int Traverse(Seq_List *L);//7. 遍历线性表
// 0.初始化线性表,返回头指针
Seq_List* InitList(Seq_List *L){
int x;
int index = 0;
L = (Seq_List *)malloc(sizeof(Seq_List));
if(L){
printf("输入一组数字,到-1结束\n");
while(1){
scanf("%d", &x);
if(x == -1){
printf("初始化成功\n\n");
break;
};
L->data[index++] = x;
}
L->length = index;
}else{
printf("空间不足,初始化失败\n\n");
}
return L;
}
//1. 返回线性表长度
int Length(Seq_List *L){
return L->length;
}
//2.获取第i个元素,返回是否获取的状态
int Get(Seq_List *L, int i, ElemType *e){
if(i<1 || i>L->length){
printf("查找下标%d越界\n",i);
return 0;
}
*e = L->data[i-1];
printf("第%d个元素是%d\n", i, *e);
return 1;
}
//3.返回第一个与e相同元素的位置,返回找寻到的下标
int Locate(Seq_List *L, ElemType e){
int i;
for(i=0; i<L->length; i++){
if(L->data[i] == e){
return i+1;
}
}
return -1;
}
//4.插入,返回是否插入成功的状态
int Insert(Seq_List *L, int i, ElemType e){
if(i<1 || i>L->length+1){
printf("插入位置有误\n");
return 0;
}
if(L->length == MAXSIZE){
printf("线性表已满无法插入新元素\n");
return 0;
}
int j;
for(j=L->length-1; j>=i-1; j--){
L->data[j+1] = L->data[j];
}
L->data[i-1] = e;
L->length++;
printf("插入成功\n");
return 1;
}
//5. 删除第i个元素,返回是否删除成功的状态
int Delete(Seq_List *L, int i){
if(i<1 || i>L->length){
printf("删除位置有误\n");
return 0;
}
int j;
for(j=i; j<L->length; j++){
L->data[j-1] = L->data[j];
}
L->length--;
printf("删除成功\n");
return 1;
}
//6. 判断线性表是否为空表 1为空,0不为空
int IsEmpty(Seq_List *L){
return (L->length == 0);
}
//7. 遍历线性表
int Traverse(Seq_List *L){
if(L->length == 0){
printf("空表\n");
return 0;
}
if(L->length>MAXSIZE || L->length<-MAXSIZE){
printf("线性表已被摧毁或未初始化\n");
return 0;
}
int j;
for(j=0; j<L->length; j++){
printf("%d ", L->data[j]);
}
printf("\n");
return 0;
}
int main(){
ElemType e;
Seq_List *L = NULL;
L = InitList(L);// 0.初始化
printf("1.顺序表表长:%d\n\n",Length(L));
printf("2.获取线性表第i个元素值:\n");
printf("请输入i的值:");
int i;
scanf("%d",&i);
Get(L, i, &e);
printf("\n");
printf("3.在线性表中查找值为x的元素:\n");
printf("请输入x:");
int x_2;
scanf("%d",&x_2);
printf("%d的位置:%d\n\n",x_2,Locate(L, x_2));
printf("4.在线性表中第i个位置插入值为x的元素:\n");
printf("请输入i:");
int i_2;
scanf("%d",&i_2);
printf("请输入x:");
int x;
scanf("%d",&x);
Insert(L, i_2, x);
Traverse(L);
printf("\n");
printf("5.在线性表中删除第i个元素:\n");
printf("请输入i:");
int i_3;
scanf("%d",&i_3);
Delete(L, i_3);
Traverse(L);
printf("\n");
printf("6.顺序表是否为空表:");
if(IsEmpty(L))
printf("True\n");
else
printf("False\n");
printf("\n");
printf("7.遍历线性表L:");
Traverse(L);
return 0;
}
实验四 线性链表的基本操作
实验要求
定义一个链式的线性表,命名为Link_List,实现如下操作:
序号 | 函数 | 功能 | 输入输出要求 |
| Length(L) | 求线性表长 | 输入——线性链表L 输出——线性链表表长(即表中元素个数) |
| Get(L,i) | 获取线性表第i个元素值 | 输入——线性链表L和位置i(1≤i≤n,n为表长) 输出——线性链表L中第i个元素的值 |
| Locate(L,x) | 在线性表中查找值为x的元素 | 输入——线性链表L和元素值x 输出——x在线性链表L中的地址,若不存在输出NULL |
| Insert(L,i,x) | 在线性表中第i个位置插入值为x的元素 | 输入——线性链表L,位置i和元素值x 输出——插入成功返回1,失败返回0 |
| Delete(L,i) | 在线性表中删除第i个元素 | 输入——线性链表L和位置i 输出——删除成功返回1,失败返回0 |
| IsEmpty(L) | 判断线性表是否为空表 | 输入——线性链表L 输出——线性链表L为空返回True,否则返回False |
| Traverse(L) | 遍历线性表L | 输入——线性链表L 输出——线性链表所有元素 |
源码
#include<stdio.h>
#include<malloc.h>
typedef int datatype;
typedef struct node
{
datatype data;
struct node* next;
}LNode,*Linklist;
LNode* create_LinkList()//创建链表
{
int data;
LNode* head, * p, * q;
head = p = (LNode*)malloc(sizeof(LNode));
scanf_s("%d", &head->data);
p->next = NULL;
while (1)
{
scanf_s("%d", &data);
q = (LNode*)malloc(sizeof(LNode));
q -> data = data;
q -> next = NULL;
p -> next = q;
p = q;
if (data == 0)
{
break;
}
}
return head;
}
void length(LNode* L)//判断长度
{
int i = 0;
while (L->next != NULL)
{
i++;
L = L->next;
}
printf("单链表长度:%d\n", i);
}
void get(LNode* L, int i)//查找第i位元素值
{
printf("第 i 个元素值: ");
for (int j = 1;j < i;j++)
{
L = L->next;
}
printf("%d\n", L->data);
}
void locate (LNode* L, int x)//寻找等于x的元素
{
int i = 1;
printf("值为x的元素的位置为:");
while (L->next != NULL)
{
if (L->data == x)
{
printf("%d\n", i);
break;
}
i++;
L = L->next;
}
}
void insert(LNode* L, int i, int x)//插入元素
{
LNode* p;
p = (LNode*)malloc(sizeof(LNode));
p->data = x;
for (int j = 1;j < i-1;j++)
{
L = L->next;
}
p->next = L->next;
L->next = p;
printf("插入成功\n");
}
void delete(LNode* L, int i)//删除元素
{
for (int j = 1;j < i - 1;j++)
L = L->next;
L->next = (L->next)->next;
printf("删除成功\n");
}
void isempty(LNode* L)//判断空表
{
if (L->data == 0)
printf("是空表\n");
else
printf("不是空表\n");
}
void Traverse(LNode* L)//遍历
{
while (L->next != NULL)
{
if ((L->next)->next == NULL)
{
printf("%d\n", L->data);
break;
}
printf("%d->", L->data);
L = L->next;
}
}
int main()
{
LNode* L;
int i, x, h, w, a;
L=create_LinkList();
printf("此时单链表各元素值如下:\n");
Traverse(L);
length(L);
printf("需要获取的元素序号i=");
scanf_s("%d", &i);
get(L, i);
printf("需要查找的元素值x=");
scanf_s("%d", &x);
locate(L, x);
printf("插入位置h=");
scanf_s("%d", &h);
printf("插入元素w=");
scanf_s("%d", &w);
insert(L,h,w);
Traverse(L);
printf("删除的元素的位置a=");
scanf_s("%d", &a);
delete(L,a);
Traverse(L);
printf("判断线性表是否为空表:");
isempty(L);
Traverse(L);
return 0;
}
如有帮助可以点个赞嘛…谢谢啦!