数据结构 (C语言) 链表
链表
逻辑结构 顺序结构
存储结构 链式存储
优点:不要求大片连续空间,改变容量方便。
可以动态的添加和删除节点
缺点:不方便随机存取,要耗费一定空间存放指针。
链表可以分为三种类型
- 单向链表:每个节点只有一个指针指向下一个节点,最后一个节点的指针指向NULL。
- 双向链表:每个节点有两个指针,分别指向上一个节点和下一个节点,可以在O(1)时间内实现向前和向后遍历。
- 循环链表:在单向或双向链表的基础上,将最后一个节点的指针指向头节点,形成一个环。
链表的种类其实有很多种,按照单双向、带头不带头、循环不循环,一共可以分为8种类型,但最常见就是单向链表和双向链表
节点结构
链表是由一个个节点构成的
单链表
data:数据域,用来存放线性表的一个数据元素
link: 指针域,用来存放一个指针,指针指向下一个节点的开始存储的地址
单链表的第一个结点也称为首结点,它的地址可以通过链表的头指针head
找到,其他结点的地址通过前驱结点的link域名找到,链表的最后一个结点
没有后继,则在link域放一个空指针NULL,图中用"^"表示
双链表
data:数据域,用来存放线性表的一个数据元素
prev: 指针域,用来存放一个指针,指针指向上一个节点的开始存储的地址
next: 指针域,用来存放一个指针,指针指向下一个节点的开始存储的地址
代码实现
单链表(指针实现)
main函数
#include "02.h"
int main()
{
S list = { NULL,0 };
int choose;
STU data;
int index;
while (1)
{
fn1();
printf("请输入选项\n");
scanf(" %d", &choose);
switch ( choose)
{
case 1:
//初始化
List_Init(&list);
break;
case 2:
//追加
printf("请输入追加的学生姓名\n");
scanf(" %s", &(data.sname));
printf("请输入追加的学生年龄\n");
scanf(" %d", &(data.age));
printf("请输入追加的学生学号\n");
scanf(" %d", &(data.stu));
printf("请输入追加的学生性别\n");
scanf(" %s", &(data.gender));
List_Append(&list, data);
break;
case 3:
//插入
printf("请选择要插入的地方\n");
scanf(" %d", &index);
printf("请输入插入的学生姓名\n");
scanf(" %s", &(data.sname));
printf("请输入插入的学生年龄\n");
scanf(" %d", &(data.age));
printf("请输入插入的学生学号\n");
scanf(" %d", &(data.stu));
printf("请输入插入的学生性别\n");
scanf(" %s", &(data.gender));
List_Insert(&list,index,data );
break;
case 4:
//显示
List_Show(list);
break;
case 5:
//查询
printf("请输入查询的学生学号\n");
scanf(" %d", &(data.stu));
List_Check(list, data.stu);
break;
case 6:
//修改
printf("请输入要修改信息的学生学号\n");
scanf(" %d", &(data.stu));
List_Edit(&list, data.stu);
break;
case 7:
//删除
printf("请输入要删除信息的学生学号\n");
scanf(" %d", &(data.stu));
List_Del(&list, data.stu);
break;
case 8:
//销毁
List_destroy(&list);
break;
case 9:
//退出
return;
default:
break;
}
}
return 0;
}
头文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <Windows.h>
#include <assert.h>
#define MaxSize 100
typedef struct Student
{
char sname[20];
int stu;
int age;
char gender[5];
}STU ;
typedef struct Stu
{
STU* list_Oreder;
int length;
}S;
void fn1();//菜单
void List_Init(S* list); //初始化
void List_Append(S* list, STU data);//追加
void List_Show(S list);//显示
void List_Insert(S* list, int index, STU data);//插入
void List_Check(S list, int stu);//查询
void List_Edit(S* list, int stu);//修改
void List_Del(S* list, int stu); //删除
void List_destroy(S* list);//销毁
函数部分
#include "02.h"
void fn1()//菜单
{
printf(" 欢迎使用学生信息系统管理平台 \n");
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("* =========================== *\n");
}
void List_Init(S *list) //初始化
{
list->list_Oreder=(STU*)malloc(sizeof(STU)*MaxSize);
assert(list->list_Oreder);
printf("初始化成功!!!\n");
}
void List_Append(S *list,STU data)//追加
{
if (list->list_Oreder == NULL)
{
printf("未初始化\n");
return;
}
list->list_Oreder[list->length] = data;
list->length++;
printf("追加成功!!!\n");
}
void List_Show(S list) //显示
{
if (list.list_Oreder==NULL)
{
printf("未初始化\n");
return;
}
printf("姓名 学号 年龄 性别\n");
for (int i = 0; i < list.length; i++)
{
printf("%s ", list.list_Oreder[i].sname);
printf("%d ", list.list_Oreder[i].stu);
printf("%d ", list.list_Oreder[i].age);
printf("%s ", list.list_Oreder[i].gender);
printf("\n");
}
}
//3 1
void List_Insert(S* list, int index, STU data)//插入
{
if (list->list_Oreder == NULL)
{
printf("未初始化\n");
return;
}
if (index > list->length)
{
printf("插入位置不合适\n");
return;
}
int ind = index - 1;
if (ind<0||ind==99)
{
printf("插入位置不合适\n");
return;
}
for (int i = ind; i < list->length; i++)
{
list->list_Oreder[i + 1] = list->list_Oreder[i];
}
list->list_Oreder[ind] = data;
list->length++;
printf("插入成功!!!\n");
}
void List_Check(S list, int stu)//查询
{
if (list.list_Oreder == NULL)
{
printf("未初始化\n");
return;
}
int flag = 0;
for (int i = 0; i < list.length; i++)
{
if(list.list_Oreder[i].stu==stu)
{
flag = 1;
printf("%s ", list.list_Oreder[i].sname);
printf("%d ", list.list_Oreder[i].stu);
printf("%d ", list.list_Oreder[i].age);
printf("%s ", list.list_Oreder[i].gender);
printf("\n");
}
}
if (flag==0)
{
printf("未查到该学生\n");
}
}
void List_Edit(S * list, int stu)//修改
{
if (list->list_Oreder == NULL)
{
printf("未初始化\n");
return;
}
int flag = 0;
int choose;
char name[20];
char sex[20];
for (int i = 0; i < list->length; i++)
{
if (list->list_Oreder[i].stu == stu)
{
flag = 1;
while(1)
{
printf("1.姓名 2.年龄 3.学号 4.性别 5.退出");
scanf(" %d", &choose);
switch (choose)
{
case 1:
printf("请输入修改后的学生姓名\n");
scanf(" %s", &name);
strcpy(list->list_Oreder[i].sname, name);
printf("修改成功!!!\n");
break;
case 2:
printf("请输入修改后的学生年龄\n");
scanf(" %d", &(list->list_Oreder[i].age));
printf("修改成功!!!\n");
break;
case 3:
printf("请输入修改后的学生学号\n");
scanf(" %d", &(list->list_Oreder[i].stu));
printf("修改成功!!!\n");
break;
case 4:
printf("请输入修改后的学生性别\n");
scanf(" %s", &sex);
strcpy(list->list_Oreder[i].gender, sex);
printf("修改成功!!!\n");
break;
case 5:
system("cls");
return;
default:
break;
}
}
}
}
if (flag == 0)
{
printf("未查到该学生\n");
}
}
void List_Del(S * list, int stu) //删除
{
if (list->list_Oreder == NULL)
{
printf("未初始化\n");
return;
}
int flag = 0;
for (int i = 0; i < list->length; i++)
{
if (list->list_Oreder[i].stu == stu)
{
flag = 1;
for (int j = i; j < list->length; j++)
{
list->list_Oreder[j] = list->list_Oreder[j + 1];
}
list->length--;
printf("删除成功!!!\n");
}
}
if (flag == 0)
{
printf("未查到该学生\n");
}
}
void List_destroy(S *list)//销毁
{
if (list->list_Oreder == NULL)
{
printf("未初始化\n");
return;
}
free(list->list_Oreder);
list->list_Oreder = NULL;
printf("销毁成功!!!\n");
}
数组形式
main函数
#include "02.h"
int main()
{
fn();
int choose;
S* list = NULL;
STU data;
int index;
while (1)
{
printf("请输入操作的指令数字\n");
scanf(" %d", &choose);
switch (choose)
{
case 1:
//初始化
list=List_Init();
break;
case 2:
//追加
printf("请输入追加的学生姓名\n");
scanf(" %s", &(data.sname));
printf("请输入追加的学生年龄\n");
scanf(" %d", &(data.age));
printf("请输入追加的学生学号\n");
scanf(" %d", &(data.stu));
printf("请输入追加的学生性别\n");
scanf(" %s", &(data.gender));
List_Append(list, data);
break;
case 3:
//插入 从一开始
printf("请输入插入的学生姓名\n");
scanf(" %s", &(data.sname));
printf("请输入插入的学生年龄\n");
scanf(" %d", &(data.age));
printf("请输入插入的学生学号\n");
scanf(" %d", &(data.stu));
printf("请输入插入的学生性别\n");
scanf(" %s", &(data.gender));
printf("请输入插入的学生的序号\n");
scanf(" %d", &index);
List_Insertion(list, index, data);
break;
case 4:
//显示
List_Display(list);
break;
case 5:
//查询
printf("请输入查询的学生学号\n");
scanf(" %d", &(data.stu));
List_Querying(list,data.stu);
break;
case 6:
//删除
printf("请输入删除学生的学号\n");
scanf(" %d", &(data.stu));
List_Del(list,data.stu);
break;
case 7:
printf("请输入修改的学生的学号\n");
scanf(" %d", &(data.stu));
List_edit(list, data.stu);
fn();
break;
case 8:
//销毁
List_destruction(&list);
break;
case 9:
//退出
return 0;
default:
break;
}
}
return 0;
}
头文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#include "stdio.h"
#include "stdlib.h"
#include "memory.h"
#include "string.h"
#include "Windows.h"
void fn();
typedef struct Student
{
char sname[20];
int age;
int stu;
char gender[5];
}STU;
typedef struct Stu
{
STU stu_Arr[100];
int length;
}S;
S* List_Init();//初始化
void List_Append(S* list, STU data);//追加
void List_Insertion(S* list, int index, STU data);//插入
void List_Display(S* list);//显示
void List_Querying(S* list, int stu);//查询
void List_Del(S* list, int stu);//删除
void List_edit(S* list, int stu);//修改
void List_destruction(S * * list);//销毁
函数部分
#include "02.h"
void fn()
{
printf(" 欢迎使用学生信息系统管理平台 \n");
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("* =========================== *\n");
}
S* List_Init()
{
system("cls");
fn();
S* list = (S*)malloc(sizeof(S));
if (list==NULL)
{
printf("初始化失败\n");
return NULL;
}
memset(list, 0, sizeof(S));
printf("初始化成功!!!\n");
return list;
}
void List_Append(S* list,STU data)
{
system("cls");
fn();
if (list == NULL)
{
printf("未初始化\n");
return;
}
list->stu_Arr[list->length] = data;
list->length++;
printf("添加成功!!!\n");
}
void List_Display(S* list)
{
system("cls");
fn();
if (list == NULL)
{
printf("未初始化\n");
return;
}
printf("姓名 学号 年龄 性别\n");
for (int i = 0; i < list->length; i++)
{
printf("%s ", list->stu_Arr[i].sname);
printf("%d ", list->stu_Arr[i].stu);
printf("%d ", list->stu_Arr[i].age);
printf("%s ", list->stu_Arr[i].gender);
printf("\n");
}
}
//1 2 3 4 5 6 7 8
void List_Insertion(S* list,int index,STU data)
{
system("cls");
fn();
if (list == NULL)
{
printf("未初始化\n");
return;
}
index -= 1;
for (int i = list->length-1; i >= index ; i--)
{
list->stu_Arr[i+1] = list->stu_Arr[i];
}
list->stu_Arr[index] = data;
list->length++;
printf("添加成功!!!\n");
}
void List_Querying(S* list, int stu)
{
system("cls");
fn();
if (list == NULL)
{
printf("未初始化\n");
return;
}
if (list->length == 0)
{
printf("不存在学生信息");
return;
}
int flag = 0;
printf("姓名 学号 年龄 性别\n");
for (int i = 0; i < list->length; i++)
{
if (list->stu_Arr[i].stu==stu)
{
printf("%s ", list->stu_Arr[i].sname);
printf("%d ", list->stu_Arr[i].stu);
printf("%d ", list->stu_Arr[i].age);
printf("%s ", list->stu_Arr[i].gender);
flag = 1;
printf("\n");
}
}
if (flag==0)
{
printf("不存在此学生\n");
}
}
//1 2 3 4 5 6 7 8
void List_Del(S* list, int stu)
{
system("cls");
fn();
if (list == NULL)
{
printf("未初始化\n");
return;
}
if (list->length == 0)
{
printf("不存在学生信息");
return;
}
int flag = 0;
for (int i = stu-1; i < list->length; i++)
{
if (list->stu_Arr[i].stu==stu)
{
list->stu_Arr[i] = list->stu_Arr[i + 1];
flag = 1;
}
}
if (flag == 0)
{
printf("不存在此学生\n");
}
else
{
list->length--;
printf("删除成功!!!\n");
}
}
void List_edit(S* list,int stu)
{
int choose;
char name[20];
char sex[5];
int flag=0;
system("cls");
if (list == NULL)
{
printf("未初始化\n");
return;
}
if (list->length == 0)
{
printf("不存在学生信息\n");
return;
}
for (int i = 0; i < list->length; i++)
{
if(list->stu_Arr[i].stu==stu)
{
flag = 1;
while(1)
{
printf("1.姓名 2.年龄 3.学号 4.性别\n请选择要修改的信息\n");
scanf(" %d", &choose);
switch (choose)
{
case 1:
printf("请输入修改后的学生姓名\n");
scanf(" %s",&name);
strcpy(list->stu_Arr[i].sname,name);
break;
case 2:
printf("请输入修改后的学生年龄\n");
scanf(" %d", &(list->stu_Arr[i].age));
break;
case 3:
printf("请输入修改后的学生学号\n");
scanf(" %d", &(list->stu_Arr[i].stu));
break;
case 4:
printf("请输入修改后的学生性别\n");
scanf(" %s",&sex );
strcpy(list->stu_Arr[i].gender,sex);
break;
case 5:
system("cls");
return;
default:
break;
}
}
}
}
if (flag==0)
{
printf("未查到该学生\n\n");
}
}
void List_destruction(S**list)
{
system("cls");
fn();
free(*list);
*list = NULL;
printf("销毁成功!!!\n");
}
双链表(带头,循环)
main函数
#include "public.h"
int main()
{
int choose;
STU data;
LH * LinkHead=NULL;
int index;
while (1)
{
print_memn();
printf("请输入选项\n");
scanf(" %d", &choose);
switch (choose)
{
case 1:
//初始化
LinkHead=Link_Init();
break;
case 2:
//打印
Link_show(LinkHead);
break;
case 3:
//头插
printf("请输入学生姓名\n");
scanf(" %s", &(data.sname));
printf("请输入学生学号\n");
scanf(" %d", &(data.stu));
printf("请输入学生年龄\n");
scanf(" %d", &(data.age));
printf("请输入学生性别\n");
scanf(" %s", &(data.gender));
Head_insert(LinkHead,data);
break;
case 4:
//尾插
printf("请输入学生姓名\n");
scanf(" %s", &(data.sname));
printf("请输入学生学号\n");
scanf(" %d", &(data.stu));
printf("请输入学生年龄\n");
scanf(" %d", &(data.age));
printf("请输入学生性别\n");
scanf(" %s", &(data.gender));
Tail_Insert(LinkHead,data);
break;
case 5:
//头删
Head_Del(LinkHead);
break;
case 6:
//尾删
Tail_Del(LinkHead);
break;
case 7:
//查找
printf("请输入要查找的学生学号\n");
scanf(" %d", &(data.stu));
Link_search(LinkHead, data.stu);
break;
case 8:
//中间删
printf("请输入要删除学生信息的学号\n");
scanf(" %d", &(data.stu));
Middle_Del(LinkHead,data.stu);
break;
case 9:
//中间插
printf("请输入要插到那个学生的后面的(学号)\n");
scanf(" %d", &index);
printf("请输入学生姓名\n");
scanf(" %s", &(data.sname));
printf("请输入学生学号\n");
scanf(" %d", &(data.stu));
printf("请输入学生年龄\n");
scanf(" %d", &(data.age));
printf("请输入学生性别\n");
scanf(" %s", &(data.gender));
Middle_Insert(LinkHead, data,index);
break;
case 10:
//销毁
Destory_Link(&LinkHead);
break;
case 11:
//退出
return;
default:
break;
}
}
return 0;
}
头文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "assert.h"
#include "Windows.h"
#define maxSize 100
typedef struct
{
char sname[20];
int stu;
int age;
char gender[5];
}STU;
typedef struct ListHead
{
STU data;
structListHead* next;
struct ListHead* before;
}LH;
void print_memn();//菜单
LH* Link_Init();//初始化
void Link_show(LH* LinkHead);//打印
void Head_insert(LH* LinkHead, STU data);//头插
void Tail_Insert(LH* LinkHead, STU data);//尾插
void Head_Del(LH* LinkHead);//头删
void Tail_Del(LH* LinkHead);//尾删
void Link_search(LH* LinkHead, int stu);//查找
void Destory_Link(LH** LinkHead);//销毁
函数部分
#include "public.h"
void print_memn()//菜单
{
printf(" 欢迎使用学生信息系统管理平台 \n");
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("* 10.销毁 *\n");
printf("* 11.退出 *\n");
printf("* =========================== *\n");
}
LH * Link_Init()//初始化
{
LH* LinkHead = (LH*)malloc(sizeof(LH));
LinkHead->before = LinkHead;
LinkHead->next = LinkHead;
system("cls");
printf(" 初始化成功!!!\n\n");
return LinkHead;
}
void Link_show(LH* LinkHead)//打印
{
if (LinkHead==NULL)
{
system("cls");
printf("请先初始化\n\n");
return;
}
if(LinkHead->next==LinkHead)
{
system("cls");
printf(" 没有数据\n\n");
return;
}
LH* temp = LinkHead->next;
system("cls");
printf(" 学号 姓名 年龄 性别\n");
while(temp!=LinkHead)
{
printf(" %d %s %d %s\n",temp->data.stu,temp->data.sname,temp->data.age,temp->data.gender);
temp = temp->next;
}
}
void Head_insert(LH* LinkHead,STU data)//头插
{
if (LinkHead == NULL)
{
system("cls");
printf("请先初始化\n\n");
return;
}
LH* temp = (LH*)malloc(sizeof(LH));
temp->data = data;
temp->next = LinkHead->next;
LinkHead->next->before = temp;
LinkHead->next = temp;
temp->before = LinkHead;
system("cls");
printf(" 插入成功\n\n");
}
void Tail_Insert(LH* LinkHead,STU data)//尾插
{
if (LinkHead == NULL)
{
system("cls");
printf("请先初始化\n\n");
return;
}
LH* temp = (LH*)malloc(sizeof(LH));
temp->data = data;
LH* temp1 = LinkHead;
while(LinkHead->next!=temp1)
{
LinkHead = LinkHead->next;
}
temp->next = temp1;
temp1->before = temp;
temp->before = LinkHead;
LinkHead->next = temp;
system("cls");
printf(" 插入成功\n\n");
}
void Head_Del(LH *LinkHead)//头删
{
if (LinkHead == NULL)
{
system("cls");
printf("请先初始化\n\n");
return;
}
if (LinkHead->next == LinkHead)
{
system("cls");
printf(" 没有数据\n\n");
return;
}
LH* temp = LinkHead->next;
LinkHead->next->next->before = LinkHead;
LinkHead->next = LinkHead->next->next;
free(temp);
system("cls");
printf(" 头删成功\n\n");
}
void Tail_Del(LH* LinkHead)//尾删
{
if (LinkHead == NULL)
{
system("cls");
printf("请先初始化\n\n");
return;
}
if (LinkHead->next == LinkHead)
{
system("cls");
printf(" 没有数据\n\n");
return;
}
LH* temp1 = LinkHead;
while (LinkHead->next != temp1)
{
LinkHead = LinkHead->next;
}
LinkHead->before->next = temp1;
temp1->before = LinkHead->before;
free(LinkHead);
system("cls");
printf(" 尾删成功\n\n");
}
void Link_search(LH* LinkHead, int stu)//查找
{
if (LinkHead == NULL)
{
system("cls");
printf("请先初始化\n\n");
return;
}
if (LinkHead->next == LinkHead)
{
system("cls");
printf(" 没有数据\n\n");
return;
}
LH* temp = LinkHead->next;
while(temp!=LinkHead)
{
if (temp->data.stu==stu)
{
system("cls");
printf(" %d %s %d %s\n\n", temp->data.stu, temp->data.sname, temp->data.age, temp->data.gender);
return;
}
else
{
temp = temp->next;
}
}
system("cls");
printf(" 未找到该学生!!!\n\n");
}
void Middle_Del(LH* LinkHead, int stu)//随机删
{
if (LinkHead == NULL)
{
system("cls");
printf("请先初始化\n\n");
return;
}
if (LinkHead->next == LinkHead)
{
system("cls");
printf(" 没有数据\n\n");
return;
}
LH* temp = LinkHead->next;
while (temp != LinkHead)
{
if (temp->data.stu == stu)
{
temp->before->next = temp->next;
temp->next->before = temp->before;
free(temp);
system("cls");
printf(" 删除成功\n\n");
return;
}
else
{
temp = temp->next;
}
}
system("cls");
printf(" 未找到该学生!!!\n\n");
}
void Middle_Insert(LH* LinkHead, STU data,int stu)//随机插
{
if (LinkHead == NULL)
{
system("cls");
printf("请先初始化\n\n");
return;
}
LH* temp1 = (LH*)malloc(sizeof(LH));
temp1->data = data;
LH* temp = LinkHead->next;
while (temp != LinkHead)
{
if (temp->data.stu == stu)
{
temp->next->before = temp1;
temp1->next = temp->next;
temp->next = temp1;
temp1->before = temp;
system("cls");
printf(" 插入成功\n\n");
return;
}
else
{
temp = temp->next;
}
}
system("cls");
printf(" 未找到该学生!!!\n\n");
}
void Destory_Link(LH** LinkHead)//销毁
{
if (LinkHead == NULL)
{
system("cls");
printf("请先初始化\n\n");
return;
}
LH* temp = (*LinkHead)->next;
LH* temp1 = NULL;
while(temp!= (*LinkHead)->next)
{
temp1 = temp->next;
free(temp);
temp = temp1;
}
free(*LinkHead);
*LinkHead = NULL;
printf(" 销毁完成\n\n");
}
注意
传值和传址的区别
传值
如果函数中写的是结构体类型的变量,相当于是定义了一个新的变量
此时是把main函数中的stu中的数据,传递给了method函数,并把stu中的数据赋给了新的变量st
我们在函数中,仅仅是修改了st中的值,对于main函数中stu的值是没有修改的
传址
如果要在函数中修改stu的值,此时就不要定义新的变量了
直接接受stu的内存地址,通过内存地址就可以修改stu中的数据了 //指针
原文地址:https://blog.csdn.net/2403_89181725/article/details/145219346
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!