#include<stdio.h>
#include<string>
#include<stdlib.h>
#define MAX 10
typedef struct Node
{
char cData[MAX];
struct Node *pNext;
}*Linklist;
int nChoice();
void vInitLink(Linklist *H1);//&H
void vCreatLinkHead(Linklist H1,char cLine[]);
void vChanceShow(Linklist H1);
void vShow(Linklist H1);
void vInLink(Linklist H1,int nPos,char cIn[]);
void vDelLink(Linklist H1,int nPos);
int main()
{
int nInPos;
int nDelPos;
int nOption;
Linklist H;
char cInData[MAX];
char cLetters[MAX];//链表节点个数可以不确定
nOption = 1;
while((nOption>0) && (nOption<7))
{
nOption = nChoice();
switch(nOption)
{
case 1:
vInitLink(&H);
printf("请输入字符串(以-1结束):\n");
while((scanf("%s",&cLetters) != EOF) && (strcmp(cLetters,"-1") != 0))//字符串不能用相等来表示=
{
vCreatLinkHead(H,cLetters);//&H这里H已经是指针了
}
vChanceShow(H);
break;
case 2:
while(printf("请输入要插入的位子(以-1结束):\n") && (1 == scanf("%d",&nInPos)) && (nInPos != -1))
{
printf("请输入要插入的值:\n");
scanf("%s",&cInData);
vInLink(H,nInPos,cInData);
vChanceShow(H);
}
break;
case 3:
while((printf("请输入要删除的位子(以-1结束):\n")) && (1 == scanf("%d",&nDelPos)) && (nDelPos != -1))
{
vDelLink(H,nDelPos);
vChanceShow(H);
}
break;
case 5:
vShow(H);
break;
case 6:
exit(0);
break;
default:
break;
}
}
return 0;
}
//选择函数
int nChoice()
{
int nOption;
printf("输入选项:\n1、创建数据\n2、插入数据\n3、删除数据\n4、查找数据\n5、输出数据\n6、退出\n");
scanf("%d",&nOption);
return nOption;
}
//初始化链表
void vInitLink(Linklist *H1)
{
*H1 = (Linklist)malloc(sizeof(Node));
(*H1)->pNext = NULL;
}
//创建链表(头插法)
void vCreatLinkHead(Linklist H1,char cLine[])
{
Node *pX;
pX = (Node*)malloc(sizeof(Node));
strcpy(pX->cData , cLine);
pX->pNext = H1->pNext;//i=0时,相当于pX->pNext = NULL;
H1->pNext = pX;
//free(pX);删除的时候才需要
}
//选择是否要显示数据(链表内容)
void vChanceShow(Linklist H1)
{
bool bIsShow;
printf("\n如果要看存储的内容,请输入1,否则输入0:\n");
scanf("%d",&bIsShow);
printf("\n");
if(1 == bIsShow)
{
vShow(H1);
}
}
//显示链表
void vShow(Linklist H1)
{
Node *pX;
pX = (Node*)malloc(sizeof(Node));
pX = H1;
while(pX->pNext != NULL)
{
pX = pX->pNext;
printf("%s\n",pX->cData);
}
printf("\n");
}
//插入节点(已知插入的位置和值)
void vInLink(Linklist H1,int nPos,char cIn[])
{
int i;
Node *pX,*pPre;
i = 0;
pPre = H1;
pX = (Node*)malloc(sizeof(Linklist));
while((pPre->pNext != NULL) && (i < nPos-1))
{
pPre = pPre->pNext;
i++;
}
if(i != nPos-1)
{
printf("插入位置有误!");
}
else
{
strcpy(pX->cData,cIn);
pX->pNext = pPre->pNext;
pPre->pNext = pX;
}
}
//删除节点(已知删除的位置)
void vDelLink(Linklist H1,int nPos)
{
int i;
Node *pX,*pPre;
i = 0;
pPre = H1;
pX = (Node*)malloc(sizeof(Linklist));
while((pPre->pNext !=NULL) && (i < nPos-1))
{
pPre = pPre->pNext;
i++;
}
if((i != nPos-1) || (pPre->pNext == NULL))
{
printf("删除位置有误\n\n");
}
else
{
pX = pPre->pNext;
pPre->pNext = pPre->pNext->pNext;
free(pX);
}
}
分享到:
相关推荐
7. 线性表是一种线性结构,栈和队列也是线性结构,而线性链表是链式存储的线性结构。二叉树是非线性结构。 8. 面向对象编程中,对象间通信通过发送消息实现。 9. 在E-R图到关系模式的转换中,实体和联系可以表示为...
11. **面向对象编程**: - **对象**:具有属性和方法的实体,是面向对象编程的核心。 - **属性**:对象的状态。 - **方法**:对象的行为。 - **类**:对象的模板或蓝图,定义了一组具有相同属性和方法的对象。 ...
### 11. 循环队列的实现 #### 知识点概述: - **循环队列**:队列的尾部与头部相连形成循环。 - **数组实现**:使用数组实现循环队列。 #### 实现思路: 1. **定义变量**:记录队列的前端和后端位置。 2. **操作...
2. 线性链表的特点:线性链表的节点存储空间可以不连续,逻辑顺序与物理顺序不一定一致。插入和删除操作时,不需要移动其他元素,这是链表相对于数组的一大优势。 3. 二叉树的性质:在完全二叉树中,叶子节点(度为...
2. **线性链表的特点**:线性链表在内存中可以不连续存储,且插入和删除操作不需要移动其他元素,这是链表的优点。B)和D)选项描述了顺序表的特点,A)选项则不准确,因为链表的逻辑顺序可以与存储顺序不同。 3. **...
2. **线性链表的特点**:线性链表的节点存储空间可以不连续,且插入和删除操作不需要移动表中的其他元素,但节点的逻辑顺序与存储顺序可能不一致。 3. **二叉树的性质**:在完全二叉树中,叶子结点的数目比度为2的...
13. **C语言常量**:常量的值在程序运行过程中不可更改,分为数值型和非数值型。选项D) "经常被使用的变量可以定义成常量"是错误的,因为常量不能被赋值。 14. **表达式类型**:'A'是字符常量,类型为int,a是整型...
21. 线性结构与非线性结构:线性表是线性结构,栈和队列也是线性结构,而链表和二叉树是非线性结构。 22. 栈的特性:栈是先进后出(LIFO)的数据结构。 23. 队列的特性:队列是先进先出(FIFO)的数据结构。 24. ...
2. **线性链表的特点**:线性链表的存储空间可以不连续,且插入和删除操作不需要移动表中的其他元素,因此C)进入插入与删除时,不需要移动表中的元素是正确的。 3. **二叉树的性质**:在一棵二叉树中,叶子节点(度...
2. 线性链表的存储顺序与逻辑顺序可以不一致,但它们的存储空间必须连续。 3. 二叉树的叶子结点总是比度为2的结点多一个。 4. 应用软件是为特定应用领域设计的软件,例如学生成绩管理系统。 5. 系统总结构图的...
2. 只有一个根结点的数据结构可以是线性的,如链表或树,也可以是非线性的,如二叉树;选项B正确。 3. 在一棵二叉树中,如果只有一个叶子结点,那么它可能是高度为3的满二叉树,也可能是高度为7的不完全二叉树,所以...
11. 面向对象的概念:面向对象是一种以对象为中心,包含封装、继承和多态等特性的编程范式。选项A正确。 12. 字符串比较:Java中的字符串是对象,"Hello".equals("hello")会比较两个字符串的内容,不区分大小写,...
循环链表和双向链表都是线性结构,因此选项C和D是错误的。 3. **二叉树**:二叉树的深度是到达最远叶子结点的路径上的边数。如果二叉树有7个结点且只有一个叶子结点,这意味着从根结点到叶子结点需要经过6条边,...
数据库是数据组织的核心,线性链表是线性表的链式表示,栈和队列是线性结构,但双向链表是非线性结构,(5)题答案为B。后序遍历二叉树时,非叶子节点在叶子节点之后访问,(6)题答案为D。满二叉树的叶子节点数量为...
根据给定的文件标题“2011年9月二级VB真卷参考答案”以及描述“2011年9月二级VB真卷参考答案”,我们可以看出这份文档是关于2011年9月全国计算机等级考试二级笔试中的Visual Basic部分的试题及答案解析。下面我们将...
5. **面向对象方法**:面向对象方法包括对象、类和继承,但过程调用是面向过程编程中的概念。 6. **软件开发阶段**:数据流程图(DFD)通常在需求分析阶段使用,用于描述数据流动和处理过程。 7. **软件设计阶段的...