顺序表
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100 /* 存储空间初始分配量 */
typedef int ElemType;
typedef struct//定义顺序表
{
ElemType length;
int* data;
}SqList;
void InitList(SqList& L)//初始化顺序表
{
L.data = new ElemType[MAXSIZE];
L.length = 0;
}
void WriteList(SqList& L)//把元素放入顺序表
{
printf("请输入你要创建的顺序表的长度:");
scanf_s("%d", &L.length);
printf("请输入%d个你要放入顺序表里的元素:", L.length);
for (int i = 0; i < L.length; i++)
scanf_s("%d", &L.data[i]);
}
bool ListInsret(SqList& L)//插入元素
{
int i, e,j;
printf("请输入要插入顺序表的元素和元素位置:");
scanf_s("%d %d", &e, &i);
if (i<1 || i>L.length + 1)
return false;
if (L.length == MAXSIZE)
return false;
for (j = L.length-1; j >= i-1; j--)
{
L.data[j + 1] = L.data[j];
}
L.data[i-1] = e;
++L.length;
printf("插入的元素是%d,插入的位置是%d\n", e, i);
return true;
}
bool ListDelete(SqList& L)//删除操作
{
int i, e, j;
printf("请输入要删除的元素位置:");
scanf_s("%d", &i);
if (i<1 || i>L.length)
return false;
if (!L.data)
return false;
e = L.data[i-1];
for (j = i; j <= L.length-1; j++)
{
L.data[j - 1] = L.data[j];
}
--L.length;
printf("删除的元素是%d,这个元素的位置是%d\n", e, i);
return true;
}
bool GetElem(SqList& L)//按位查找
{
int i;
printf("你要找第几个元素:");
scanf_s("%d", &i);
if (!L.data || i<1 || i>L.length)
{
printf("查找失败\n");
return false;
}
printf("第%d个元素是%d\n", i, L.data[i-1]);
return true;
}
void LocateElem(SqList& L)//按值查找
{
int e;
int k = 1;
printf("输入你要查找的元素值:");
scanf_s("%d", &e);
for (int i = 0; i < L.length; i++)
if (L.data[i] == e)
{
printf("找到了,是第%d个元素\n", i + 1);
k = 0;
break;
}
if (k)
printf("找不到元素%d\n", e);
}
bool PrintList(SqList& L)//打印顺序表
{
if (!L.data)
return false;
printf("顺序表里的元素有:");
for (int i = 0; i < L.length; i++)
printf("%d ", L.data[i]);
printf("\n");
return true;
}
void DestroyList(SqList& L)//销毁顺序表
{
char a;
getchar();
printf("是否销毁顺序表(Y/N):");
scanf_s("%c", &a);
if (a == 'Y')
{
L.length = 0;
delete L.data;
printf("顺序表已销毁\n");
}
}
int Length(SqList& L)//求表长
{
if (L.length == 0)
return 0;
return L.length;
}
int main()
{
SqList L;
InitList(L);
WriteList(L);
PrintList(L);
ListInsret(L);
PrintList(L);
ListDelete(L);
PrintList(L);
GetElem(L);
LocateElem(L);
int len = Length(L);
printf("顺序表的表长:%d\n", len);
DestroyList(L);
return 0;
}
单链表
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef int ElemType;
//定义单链表结构
typedef struct Node
{
ElemType data;//数据域
struct Node* next;//指针域,指向下一节点
}LNode,* LinkList;
//函数声明(若未声明,可能会有警告甚至错误)
LinkList initList(LinkList &L);
LinkList createList(int len);
int GetElem(LinkList L, int i, ElemType &e);
int ListInsert(LinkList &L, int i, ElemType e);
int ListDelete(LinkList &L, int i, ElemType *e);
void reverseLinkList(LinkList L);
int LocateElem(LinkList L, ElemType e);
int getLen(LinkList L);
int isEmpty(LinkList L);
void printLinkList(LinkList L);
int main()
{
LinkList L;
ElemType e;
int len, i;
printf("创建元素个数:");
scanf_s("%d", &len);
printf("\n请输入:");
L = createList(len);
printf("当前链表所有元素:");
printLinkList(L);
printf("\n请输入查找元素位置:");
scanf_s("%d", &i);
GetElem(L, i, e);
printf("\n元素%d已取值", e);
printf("\n插入位置和插入值(中间用空格隔开):");
scanf_s("%d%d", &i, &e);
ListInsert(L, i, e);
printf("\n插入元素后链表所有元素:");
printLinkList(L);
printf("\n请输入删除元素位置:");
scanf_s("%d", &i);
ListDelete(L, i, &e);
printf("\n元素%d已删除", e);
printf("\n删除后链表所有元素:");
printLinkList(L);
printf("\n请输入查找元素:");
scanf_s("%d", &e);
if (LocateElem(L, e) != -1)
{
printf("\n%d位于:%d", e, LocateElem(L, e));
}
else printf("\n%d未找到", e);
reverseLinkList(L);
printf("\n转置后链表所有元素:");
printLinkList(L);
return 0;
}
//初始化,创建头结点
LinkList initList(LinkList &L)
{
L = new LNode;//为头结点分配空间
L->next = NULL;//头结点指针域置空
return L;
}
//创建指定个数的单链表 后差
LinkList createList(int len)
{
int i;
ElemType e;
LinkList L = initList(L), r, n;//分别定义头指针、尾指针、新指针
r = L;//尾指针初始化为头指针
for (i = 0; i < len; i++)
{
scanf_s("%d", &e);
n = new LNode;//申请空间
n->data = e;
n->next = NULL;//新指针指针域置空
r->next = n;//将新指针链入单链表末尾
r = r->next;//尾指针往后移
}
return L;
}
int GetElem(LinkList L, int i, ElemType &e)
{
if (isEmpty(L)) return -1;
LinkList p;
p = L->next;
int j = 1;
while (p && j<i)
{
p = p->next;
++j;
}
if (!p || j > i)
return -1;
e = p->data;
return 1;
}
//将元素插入指定位置
int ListInsert(LinkList& L, int i, ElemType e)
{
LinkList p = L, s;
int j=0;
while (p&&(j<i-1))
{
p = p->next;
++j;
}
if (i < 1 || i > getLen(L) + 1) return 0;//插入位置错误
s = new LNode;
s->data = e;
s->next = p->next;//先把新指针(插入值)链入尾指针后一个节点
p->next = s;//再把新指针(插入值)链入尾指针之后
return 1;
}
//将指定位置元素删除
int ListDelete(LinkList& L, int i, ElemType *e)
{
LinkList p = L,q;
int j=0;
while ((p->next) && (j<i-1))
{
p = p->next;
++j;//将尾指针移动到删除位置
}
if (i < 1 || i > getLen(L)) return 0;//删除位置错误
q = p->next;//删除元素节点
*e = q->data;//保存删除元素值
p->next = q->next;//将尾指针跳过删除节点链入下一个节点
delete q ;//释放删除节点
return 1;
}
//转置单链表:采用前插法
void reverseLinkList(LinkList L)
{
LinkList r, p, q;//定义尾指针(紧贴头指针)、欲插入指针、遍历指针
r = L->next;//尾指针紧贴头指针
p = q = r->next;//从第二个元素开始
r->next = NULL;//尾指针置空
while (q)//q相当于q != NULL
{
q = q->next;//遍历指针后移
p->next = r;//欲插入指针链入尾指针之前
L->next = p;//欲插入指针链入头指针之后
r = p;//尾指针向前移
p = q;//欲插入指针与遍历指针同步
}
}
//查找指定元素,返回指定元素位序
int LocateElem(LinkList L, ElemType e)
{
if (isEmpty(L)) return -1;
int i = 1;//位序从1开始、下标从零开始
LinkList p = L->next;
while (p && p->data!=0)
{
if (p->data == e)
return i;//找到指定元素,返回位序
p = p->next;//尾指针后移
i++;
}
return -1;//遍历完成仍未找到返回-1
}
int getLen(LinkList L)
{
if (L->next == NULL) return 0;//头指针指针域为空,说明单链表不含任何元素
int len = 0;
LinkList r = L->next;
while (r)
{
r = r->next;//尾指针后移
len++;
}
return len;
}
int isEmpty(LinkList L)
{
return !L->next;//L->next == NULL亦可
}
void printLinkList(LinkList L)
{
LinkList p;
p = L->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
}