顺序表(顺序结构)
以下是对顺序表构建菜单的基本操作:初始化,输入,输出,插入,删除等。
#include<stdio.h> #include<stdlib.h> #define maxsize 100 #define ERROR 0 #define ture 1 //创建顺序表 struct sqlist { int* elem;//声明动态数组 int length;//记录表的当前长度 int size;//记录表的分配容量 }; //初始化顺序表 sqlist Initlist(sqlist& L) { L.elem = (int*)malloc(maxsize * sizeof(int));//创建一个空的顺序表,动态申请存储空间 if (!L.elem) //如果申请失败,做出提示并安全推出 { printf("初始化失败"); exit(0); } L.length = 0;//表的初始长度为0 L.size = maxsize;//表的存储空间为maxsize return L; } //输入顺序表 sqlist creat_sqlist(sqlist& L) { printf("输入顺序表"); int i = 0; scanf("%d", &L.elem[i]); while (L.elem[i] != 0) { i++; scanf_s("%d", &L.elem[i]); } L.length = i; return L; } //输出顺序表 sqlist print_sqlist(sqlist& L) { printf("存储的数据如下:\n"); for (int i = 0; i < L.length; i++) printf("%d ", L.elem[i]); printf("\n"); return L; } //顺序表的插入 int sqlist_insert(sqlist& l, int i, int e) { if ((i < 1) || (i > l.length + 1))return ERROR; if (l.length == maxsize)return ERROR; for (int j = l.length ; j >= i; j--) { l.elem[j] = l.elem[j-1]; } l.elem[i] = e; ++l.length; return ture; } //顺序表的删除 int sqlist_delete(sqlist& L, int i, int& e) { if (i<1 || i>L.length) { return false; } e = L.elem[i - 1];//将被删除的元素赋值给e for (int j = i; j < L.length; j++)//将第i个位置后的元素前移 { L.elem[j - 1] = L.elem[j]; } L.length--;//长度减1 return true; } int LocateElem(sqlist L, int e) { int i; for (i = 0; i <= L.length; i++) { if (L.elem[i] == e) return i + 1;//下标为i的元素值等于e,返回其位序i+1 } return 0;//退出循环,说明查找失败 } int main() { int i, y, cord; sqlist La; do { printf("\n 主菜单 \n"); printf("1 建立线性表 \n"); printf("2 插入一个元素 \n"); printf("3 删除一个元素 \n"); printf("4 查找一个元素 \n"); printf("5 退出 \n"); printf("------------------\n"); printf("请输入你的选择(1,2,3,4,5)"); scanf("%d", &cord); switch (cord) { case 1: { Initlist(La); creat_sqlist(La); printf("List La "); print_sqlist(La); }break; case 2: { printf("\n"); printf("请输入插入元素位置及元素:"); scanf("%d%d", &i, &y); sqlist_insert(La, i, y); printf("list Lc "); print_sqlist(La); }break; case 3: { printf("请输入删除位置"); scanf("%d", &i); int a = 0; sqlist_delete(La,i,a); printf("list La "); print_sqlist(La); }break; case 4: { int b; printf("查找元素\n"); scanf("%d", &i); b=LocateElem(La, i); printf("查找元素的位置是 %d\n", b); }break; case 5:exit(0); } } while (cord <= 5); }
单链表(链式结构)
以下是对单链表链式结构的操作以构建菜单的方式进行
操作包括:前插法,后插法,取值,插入,查找,删除,合并以及删除单链表等。
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define NULL 0
typedef int elemtype;
typedef struct LNode {
elemtype date;
struct LNode* next;
}LNode, * LinkList;
//初始化
int Initlist_L(LinkList& phead) {
phead = new LNode;//生成新结点作为头结点,用头指针phead指向头结点
phead->next = NULL;
return OK;
}
//插入
int Insertlist_L(LinkList& L, int i, elemtype e) {
LinkList p;
int j = 0;
p = L;
//查找第i-1个结点,p指向该结点
while (p && j < i - 1) {
p = p->next;
++j;
}
if (!p || j > i - 1) {
printf("插入的位置不合法!\n");
}
LinkList s;
s = new LNode;//生成新结点s
s->date = e;//将*s的数据域置为e
s->next = p->next;//将结点*s的指针域指向结点a(i)
p->next = s;//将结点*p的指针域指向结点*s
return OK;
}
//删除
int Deletelist_L(LinkList& L, int i) {
LinkList p = L;
int j = 0;
//查找第i-1个结点,p指向该结点
while ((p->next) && (j < i - 1)) {
p = p->next;
++j;
}
if (!(p->next) || (j > i - 1)) printf("删除位置不合理");//当i>n或i<1时,删除位置不合理
LinkList q = p->next;//临时保存被删除结点的地址以备释放
p->next = q->next;//改变删除结点前驱结点的指针域
delete q;//释放删除结点的空间
return OK;
}
//前插法创建单链表
void CreatlistFromHead_L(LinkList& phead) {
int e;
scanf("%d", &e);
while (e != -1) {
LinkList s = new LNode;//生成新节点*s
//将新结点*s插入头结点的后面
s->date = e;
s->next = phead->next;
phead->next = s;
scanf("%d", &e);
}
}
//后插法创捷单链表
void CreatlistFromTail_L(LinkList& phead) {
phead = new LNode;
phead->next = NULL;//先创建一个带头结点单链表
LinkList r = phead;//尾指针指向头结点
int e;
scanf_s("%d", &e);
while (e != -1) {
LinkList s = new LNode;//生成新结点
s->date = e;
s->next = NULL;
r->next = s;
r = s;//尾指针指向新的尾结点
scanf("%d", &e);
}
}
//单链表的输出
void printlist_L(LinkList& L) {
LinkList p = L->next;
printf("单链表:");
while (p) {
printf("%3d", p->date);
p = p->next;
}
printf("\n");
}
//在单链表中取值
int GetElemlist_L(LinkList& L) {
printf("请输入取第几个元素");
int i;
scanf("%d", &i);
LinkList p = L->next;
int j = 1;
while (p && j < i) {
p = p->next;
j++;
}
if (!p)return NULL;
int e = p->date;
printf("第%d个元素是:%d\n", i, e);
return e;
}
//在单链表中查找元素的地址
int LocateElemList_L(LinkList& L, elemtype e) {
int i;
LinkList p = L->next;
i = 1;
while (p && p->date != e) {
++i;
p = p->next;
}
if (p)
return i;
else
return NULL;
}
//单链表的长度输出
int Lengthlist_L(LinkList& L) {
int i = 0;
LinkList p = L->next;
while (p!= NULL) {
++i;
p = p->next;
}
return i;
}
//合并单链表
LinkList Mergelist_L(LinkList& L1, LinkList& L2) {
LinkList head = new LNode;
LinkList p1 = L1->next;//指针p1扫描链表L1
LinkList p2 = L2->next;//指针p2扫描链表L2
LinkList pre = head;
while (p1 && p2) {
if (p1->date <= p2->date) {
pre->next = p1;
p1 = p1->next;
}
else {
pre->next = p2;
p2 = p2->next;
}
pre = pre->next;
}
pre->next = p1 == NULL ? p2 : p1;
return head;
}
//销毁单链表
int Freelist_L(LinkList& L) {
while (L) {
LinkList p = L->next;
free(L);
L = p;
}
printf("单链表已销毁\n");
return OK;
}
int main() {
LinkList L1;
elemtype c, date;//e插入,删除元素,date查找的元素
int inde, n;//index插入元素的位置,n删除元素的位置
int num;
do {
printf(" 主菜单 \n");
printf("1 前插法 \n");
printf("2 后插法 \n");
printf("3 取值 \n");
printf("4 插入一个元素\n");
printf("5 查找一个元素 \n");
printf("6 删除一个元素\n");
printf("7 合并链表 \n");
printf("8 删除单链 \n");
printf("9 退出 \n");
printf("请输入选择1 2 3 4 5 6\n");
scanf("%d", &num);
switch (num)
{
case 1: {
printf("前插法输入(空格分开)");
Initlist_L(L1);
CreatlistFromHead_L(L1);//前插法输入L1
printf("前插法输入单链表L1\n");
printlist_L(L1);//输出L1
printf("单链表L1的长度:%d\n", Lengthlist_L(L1));
}break;
case 2: {
printf("后插法输入(空格分开)");
Initlist_L(L1);
CreatlistFromTail_L(L1);//前插法输入L1
printf("前插法输入单链表L1\n");
printlist_L(L1);//输出L1
printf("单链表L1的长度:%d\n", Lengthlist_L(L1));
}break;
case 3: {
printlist_L(L1);
GetElemlist_L(L1);
}break;
case 4: {
printlist_L(L1);
printf("请输入插入元素的位置和元素");
scanf("%d %d", &inde, &c);
Insertlist_L(L1, inde, c);
printlist_L(L1);
}break;
case 5: {
printlist_L(L1);
printf("请输入查找元素");
scanf("%d", &c);
int k = LocateElemList_L(L1, c);
printf("元素%d是第几个%d\n", c, k);
}break;
case 6: {
printlist_L(L1);
printf("请输入删除第几元素");
scanf("%d", &n);
Deletelist_L(L1, n);
printf("单链表:");
printlist_L(L1);
}break;
case 7: {
LinkList L2;
printlist_L(L1);
printf("后插法输入(空格分开)");
Initlist_L(L2);
CreatlistFromTail_L(L2);//前插法输入L1
printf("前插法输入单链表L1\n");
printlist_L(L2);//输出L2
LinkList L3 = Mergelist_L(L1, L2);
printlist_L(L3);
}break;
case 8: {
Freelist_L(L1);
}break;
}
} while (num <= 8);
return 0;
}
如果有错误还请大家多多指教!!!
可以在评论区进行交流。