今天主要对链表的创建进行了深入理解---头插以及尾插法
今天只是对前六种基本操作进行了回顾(有点遗憾没弄完 ~好困)
今天330行!!!
明天继续加油。
!!!
#define _CRT_SECURE_NO_WARNINGS
#define MAXSIZE 5
#include<stdio.h>
#include<Windows.h>
#include<string.h>
#include<malloc.h>
//结点类型说明
typedef struct LinkNode {
int date;
struct LinkNode* next;
}LNode;
//建立单链表1--头插法
void CreatListF01(LNode*& L, int a[]);//用于程序快速检验
void CreatListF(LNode*& L);
//建立单链表2--尾插法
void CreatListR01(LNode*& L, int a[]);//用于程序快速检验
void CreatListR(LNode*& L);
//打印元素
void DisplayListF(LNode*& L);
//销毁链表
void DestoryList(LNode*& L);
//检测表是否为空
bool ListEmpty(LNode*& L);
//求表的长度
int ListLength(LNode*& L);
//求表中的‘e’元素
int GetList(LNode*& L, int e);
//插 入‘e’元素
int ListSert(LNode*& L, int e, int n);
void CreatListF01(LNode*& L, int a[]) {
LNode* s;
printf("请先设定要输入的数据数量\n\n\t\t\t\t\t!!!!!(注意:数据最多可储存%d个)!!!!!\n", MAXSIZE);
int num1;
scanf("%d", &num1);
printf("开始录入\n");
L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;
for (int i = 0; i < num1; ++i) {
s = (LNode *)malloc(sizeof(LNode));
printf("第%d个元素: ", i + 1);
s->date = a[i];
s->next = L->next;
L->next = s;
}
}
void CreatListF(LNode*& L) {
LNode* s;
printf("请先设定要输入的数据数量\n\n\t\t\t\t\t!!!!!(注意:数据最多可储存%d个)!!!!!\n", MAXSIZE);
int num1;
scanf("%d", &num1);
printf("开始录入\n");
L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;
for (int i = 0; i < num1; ++i) {
s = (LNode*)malloc(sizeof(LNode));
printf("第%d个元素: ", i + 1);
scanf("%d", &s->date);
s->next = L->next;
L->next = s;
}
}
void CreatListR01(LNode*& L, int a[], int n) {
LNode* s, * r;
printf("请先设定要输入的数据数量\n\n\t\t\t\t\t!!!!!(注意:数据最多可储存%d个)!!!!!\n", MAXSIZE);
int num1;
scanf("%d", &num1);
printf("开始录入\n");
L = (LNode*)malloc(sizeof(LNode));
r = L;
for (int i = 0; i < num1; ++i) {
s = (LNode*)malloc(sizeof(LNode));
printf("第%d个元素: ", i + 1);
s->date = a[i];
r->next = s;
r = s;
}
r->next = NULL;
}
void CreatListR(LNode*& L) {
LNode* s, * r;
printf("请先设定要输入的数据数量\n\n\t\t\t\t\t!!!!!(注意:数据最多可储存%d个)!!!!!\n", MAXSIZE);
int num1;
scanf("%d", &num1);
printf("开始录入\n");
L = (LNode*)malloc(sizeof(LNode));
r = L;
for (int i = 0; i < num1; ++i) {
s = (LNode*)malloc(sizeof(LNode));
printf("第%d个元素: ", i + 1);
scanf("%d", &s->date);
//s->date = a[i];
r->next = s;
r = s;
}
r->next = NULL;
}
void DisplayListF(LNode*& L) {
LNode *p=L->next;
int i=0;
if (p == NULL)printf("没有数据录入\n");
while( p != NULL) {
i++;
printf("第%d个元素:%d\n",i, p->date);
p = p->next;
}
printf("\n");
}
void DestoryList(LNode*& L) {
LNode* p, * q;
p = L;
q = L->next;
while (q != NULL) {
free(p);
p = q;
q = p->next;
}
free(p);
printf("销毁完成");
}
bool ListEmpty(LNode*& L) {
return (L->next == NULL);
}
int ListLength(LNode*& L) {
int i=-1;
LNode* p = L;
while (p != NULL) {
i++;
p = p->next;
}
return i;
}
int GetList(LNode*& L, int e) {
int i=-1;
LNode* p=L;
while (p != NULL) {
i++;
if (p->date == e) {
printf("\t\t\t\t\t*****表中有该元素,且该元素为---第%d个****\n",i);
return 0;
}
p = p->next;
}
printf("\t\t\t\t\t*********表中没有该元素********\n");
return 0;
}
int ListSert(LNode*& L, int e, int n) {
LNode* q = L, * p;
LNode* j = NULL;
j = (LNode*)malloc(sizeof(LNode));
if (n<0 || n>ListLength(L)) {
printf("\t\t\t\t\t*********无法插入*********\n");
return 0;
}
int i = 1;
p = q;
if (i == n) {
j->date = e;
j->next = q;
}
else {
for (; i < n; i++) {
p = p->next;
}
j->next = p->next;
j->date = e;
p = j;
}
printf("插入完成");
return 0;
}
int main() {
LNode* L;
//int a[] = { 1,2,3,4,5,6,7,8,9 };
//int n = 5;
int choose;
int num;
while (1) {
printf("\n");
printf("\n\t\t\t 菜 单 \n");
printf("\n\t\t\t\t\t***************************************\n");
printf("\n\t\t\t\t\t1-创 建 表 2-销 毁 表 \n");
printf("\n\t\t\t\t\t3-检测表是否为空 4-求 表 的 长 度 \n");
printf("\n\t\t\t\t\t5-输 出 线 性 表 6-求表中的‘e’元素 \n");
printf("\n\t\t\t\t\t7-插 入‘e’元素 8-删 除 ‘e’ 元 素 \n");
printf("\n\t\t\t\t\t*************** 9-练习 ****************\n");
printf("\n\t\t\t\t\t*************** 0-退出 ****************\n");
printf("\n\n\n");
printf("请进行选项操作:");
scanf("%d", &choose);
switch (choose) {
case 1: {
printf("请选择:\t\t\t\t\t1-顺序排列\t2-逆序排列\n");
while (1) {
scanf("%d", &num);
if (num == 1) {
CreatListR(L); break;
}
else if (num == 2) {
CreatListF(L); break;
}
else {
printf("请在1/2之间做出选择");
}
}
printf("\n");
system("pause");
break;
}
case 2: {
DestoryList(L);
printf("\n");
printf("\n");
printf("\n");
printf("\t\t\t\t********友情提醒:在销毁完成后无法进行其他对表的操作操作********\n");
printf("\n");
printf("\n");
printf("\n");
system("pause");
break;
}
case 3: {
bool a3=ListEmpty(L);
if (a3 == false) {
printf("\t\t\t\t\t *********表并不为空*********\n");
}
else {
printf("\t\t\t\t\t\t*********表为空*********");
}
printf("\n");
system("pause");
break;
}
case 4: {
int a4=ListLength(L);
printf("表的长度为:%d\n", a4);
printf("\n");
system("pause");
break;
}
case 5: {
DisplayListF(L);
printf("\n");
system("pause");
break;
}
case 6: {
printf("\t\t\t\t\t*********请输入你要查找的元素*********\n");
int num6;
scanf("%d", &num6);
GetList(L,num6);
printf("\n");
system("pause");
break;
}
case 7: {
int num7, p7;
DisplayListF(L);
printf("请选择你要插入的元素和位置\n");
scanf("%d\n%d", &num7, &p7);
ListSert(L, num7, p7);
printf("\n");
DisplayListF(L);
system("pause");
break;
}
case 8:
{
printf("\n");
system("pause");
break;
}
case 9: {
printf("\n");
system("pause");
break;
}
case 0: {
return 0;
}
default: {
printf("请输入正确的选项");
printf("\n");
system("pause");
break;
}
}
}
return 0;
}