#顺序表
1.初始化顺序表L;
2.依次在L尾部插入元素-1,21,13,24,8;
3.输出顺序表;
4.输出顺序表的长度;
5.判断顺序表L是否为空;
6.输出顺序表L的第3个元素;
7.输出元素24的位置;
8.在L的第4个元素前插入元素0;
9.输出顺序表;
10.删除L的第5个元素;
11.输出顺序表。
#include<stdio.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef int ElemType; //数据类型
typedef int Status; //函数返回值类型
//顺序表的存储结构
typedef struct
{
ElemType *elem;
int length,size;
}SqList;
Status InitList(SqList &L)
{//初始化
L.elem = new ElemType[MAXSIZE];
if (!L.elem)return ERROR;
L.length = 0;
L.size = MAXSIZE;
return OK;
}
Status ListLength(SqList L)
{//求顺序表长
return L.length;
}
Status ListEmpty(SqList L)
{//判断空表
if (L.length == 0)return ERROR;
}
Status GetElem(SqList L, ElemType &e, int i)
{//求第i个位置的元素值
if (i<1 || i>L.length)return ERROR;
else e = L.elem[i - 1];
return OK;
}
int LocateElem(SqList L, ElemType e)
{//求元素值的位置
for (int i = 0; i < L.length; i++)
if (L.elem[i] == e)return i+1;
return 0;
}
Status ListInsert(SqList &L, int i, ElemType e)
{//插入
if (i<1 || i>L.length + 1) return ERROR; //插入位置不合法
if (L.length == MAXSIZE)return ERROR; //存储空间已满
for (int j = L.length - 1; j >= i - 1; j--)
L.elem[j + 1] = L.elem[j]; //后移n-i+1
L.elem[i - 1] = e;
L.length++; //长度加一
return OK;
}
Status ListDelete(SqList &L, ElemType &e, int i)
{//删除
if (i<1 || i>L.length)return ERROR; //删除位置不合法
e = L.elem[i - 1]; //保留被删除值
for (int j = i; j < L.length; j++)
L.elem[j - 1] = L.elem[j]; //前移
--L.length;
return OK;
}
int main()
{
SqList L;
InitList(L); //初始化
//插入建立顺序表
int e;
for (int i = 0; i < 5; i++)
{
scanf_s("%d", &e);
ListInsert(L, i + 1, e);
}
//输出顺序表
for (int i = 0; i < 5; i++)
printf("%3d", L.elem[i]);
printf("\n");
//求表长
printf("顺序表长:%d\n", ListLength(L));
//判空
ListEmpty(L);
//求第三个元素的值
int num;
GetElem(L, num, 3);
printf("第三个元素值:%d\n", num);
//求元素值为24的位置
int n;
n=LocateElem(L, 24);
printf("元素值为24的位置NO.%d\n", n);
//在第四个位置插入元素0并输出
ListInsert(L, 4, 0);
printf("插入后的元素:\n");
for (int i = 0; i < 6; i++)
{
printf("%3d", L.elem[i]);
}
printf("\n");
//删除第5个元素并输出
int l;
ListDelete(L, l, 5);
printf("删除后的元素:\n");
for (int i = 0; i < 5; i++)
{
printf("%3d", L.elem[i]);
}
return 0;
}
#单链表
1.初始化单链表h;
2.依次在h尾部插入元素-1,21,13,24,8;
3.输出单链表;
4.输出单链表的长度;
5.判断单链表h是否为空;
6.输出单链表h的第3个元素;
7.输出元素24的位置;
8.在h的第4个元素前插入元素0;
9.输出单链表;
10.删除h的第5个元素11.输出单链表。
#include<stdio.h>
#define OK 1
#define ERROR 0
int n = 5;
typedef int ElemType; //数据类型
typedef int Status; //函数返回值类型
//单链表的存储结构
typedef struct LNode
{
ElemType data; //数据域
struct LNode*next; //指针域
}LNode,*LinkList; //LinkList为指向结构体LNode的指针类型
//初始化
Status InitList(LinkList &L)
{
L = new LNode; //生成新的结点作为新结点,用头指针L指向结点
L->next = NULL; //头结点的指针域置空
return OK;
}
//前插法建立单链表
void CreateList_R(LinkList &L, int n)
{
LinkList p;
L = new LNode;
L->next = NULL; //先建立一个带头结点的空链表
for (int i = 0; i < n; ++i)
{
p = new LNode; //生成新结点*p
scanf_s("%d", &p->data); // 赋值数据域(VS2017输入只支持scanf_s)
p->next = L->next; L->next = p;// 将新结点p插入到头节点之后
}
}
//求表长
Status ListLength(LinkList L, int &num)
{
num = 0;
LinkList p=L->next;
while (p)
{
p = p->next;
num++;
}
return OK;
}
//判空
Status ListEmpty(LinkList L)
{
if (!L)return ERROR;
}
//求第i个元素值
Status GetElem(LinkList L, int i, ElemType&e)
{
int j = 0; //计数器j赋值0
LinkList p = L->next;
while (p &&j < i - 1)
{
p = p->next;
++j;
}
if (!p||j>i)return ERROR; //判断i是否合法
e = p->data; //取第i个结点的数据域
}
//求元素值为e的位置
Status LocateElem(LinkList L, int e)
{
LinkList p = L->next; //初始化,p指向首元结点
int j = 0;
while (p)
{
if (p->data == e)return j + 1;
j++;
p = p->next;
}
return ERROR;
}
//在第i个位置插入元素e
Status ListInsert(LinkList &L, int i, ElemType e)
{
LinkList p = L;
int j = 0;
while (p &&j < i - 1) //查找第i-1个结点,p指向该结点
{
p = p->next;
++j;
}
if (!p || j > i - 1)return ERROR;//判断i位置合法
LinkList s; //生成新结点s
s = new LNode;
s->data = e; //数据域赋值
s->next = p->next; //s的指针域指向结点
p->next = s; //结点p的指针域指向结点s
return OK;
}
//删除第i个元素
Status ListDelete(LinkList &L, int i)
{
LinkList p = L,q;
int j = 0;
while (p->next&&j < i - 1) //查找第i-1个结点,p指向该结点
{
p = p->next; ++j;
}
if (!(p->next) || j > i - 1)return ERROR; //判断删除位置是否合理
q = p->next; //临时保存被删结点以备释放
p->next = q->next; //改变删除结点前驱结点的指针域
delete q; //释放删除结点
return OK;
}
int main()
{
int num;
LinkList h,p;
//初始化
InitList(h);
//前插法建立单链表
CreateList_R(h,n);
//输出单链表
p = h->next;
for (int i = 0; i < n; i++)
{
printf("%3d", p->data);
p = p->next;
}
//求表长
ListLength(h, num);
printf("\n链表长度:%d\n",num);
//判空
ListEmpty(h);
//求单链表第3个元素的值
int e;
GetElem(h, 3, e);
printf("第三个结点元素值:%d\n", e);
//求元素值为24的位置
int j;
j=LocateElem(h, 24);
printf("元素值为24的位置NO.%d\n", j);
//在第4个结点前插入元素值为0的结点并输出
ListInsert(h,4,0);
printf("在第4个结点前插入元素值为0的结点:\n");
p = h->next;
for (int i = 0; i < n+1; i++)
{
printf("%3d", p->data);
p = p->next;
}
printf("\n");
//删除第5个结点
ListDelete(h, 5);
printf("删除第5个结点:\n ");
p = h->next;
for (int i = 0; i < n + 1; i++)
{
printf("%3d", p->data);
p = p->next;
}
}