`
synchronized_lala
  • 浏览: 40570 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

线性链表(面向过程)--2011.11.13

阅读更多

 

#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);
	}
}
1
2
分享到:
评论

相关推荐

    2011湖北省计算机等级考试试题-二级C试题考试技巧、答题原则.doc

    7. 线性表是一种线性结构,栈和队列也是线性结构,而线性链表是链式存储的线性结构。二叉树是非线性结构。 8. 面向对象编程中,对象间通信通过发送消息实现。 9. 在E-R图到关系模式的转换中,实体和联系可以表示为...

    2011年计算机等级考试vfp复习纲要(必备).pdf

    11. **面向对象编程**: - **对象**:具有属性和方法的实体,是面向对象编程的核心。 - **属性**:对象的状态。 - **方法**:对象的行为。 - **类**:对象的模板或蓝图,定义了一组具有相同属性和方法的对象。 ...

    2011-2012学年第二学期《数据结构与Java集合框架》机试.docx

    ### 11. 循环队列的实现 #### 知识点概述: - **循环队列**:队列的尾部与头部相连形成循环。 - **数组实现**:使用数组实现循环队列。 #### 实现思路: 1. **定义变量**:记录队列的前端和后端位置。 2. **操作...

    2011年9月全国计算机二级C语言真题试卷.pdf

    2. 线性链表的特点:线性链表的节点存储空间可以不连续,逻辑顺序与物理顺序不一定一致。插入和删除操作时,不需要移动其他元素,这是链表相对于数组的一大优势。 3. 二叉树的性质:在完全二叉树中,叶子节点(度为...

    2011年9月计算机等级考试二级C++真题.pdf

    2. **线性链表的特点**:线性链表在内存中可以不连续存储,且插入和删除操作不需要移动其他元素,这是链表的优点。B)和D)选项描述了顺序表的特点,A)选项则不准确,因为链表的逻辑顺序可以与存储顺序不同。 3. **...

    2011年9月计算机二级access笔试试题及答案1.pdf

    2. **线性链表的特点**:线性链表的节点存储空间可以不连续,且插入和删除操作不需要移动表中的其他元素,但节点的逻辑顺序与存储顺序可能不一致。 3. **二叉树的性质**:在完全二叉树中,叶子结点的数目比度为2的...

    2011年9月全国计算机二级C语言考试真题及答案.pdf

    13. **C语言常量**:常量的值在程序运行过程中不可更改,分为数值型和非数值型。选项D) "经常被使用的变量可以定义成常量"是错误的,因为常量不能被赋值。 14. **表达式类型**:'A'是字符常量,类型为int,a是整型...

    2011年二级ACCESS考试笔试题目[归类].pdf

    21. 线性结构与非线性结构:线性表是线性结构,栈和队列也是线性结构,而链表和二叉树是非线性结构。 22. 栈的特性:栈是先进后出(LIFO)的数据结构。 23. 队列的特性:队列是先进先出(FIFO)的数据结构。 24. ...

    2011年9月全国计算机二级C语言考试真题及答案[归类].pdf

    2. **线性链表的特点**:线性链表的存储空间可以不连续,且插入和删除操作不需要移动表中的其他元素,因此C)进入插入与删除时,不需要移动表中的元素是正确的。 3. **二叉树的性质**:在一棵二叉树中,叶子节点(度...

    二年九月全国计算机二级C语言考试真题及答案.pdf

    2. 线性链表的存储顺序与逻辑顺序可以不一致,但它们的存储空间必须连续。 3. 二叉树的叶子结点总是比度为2的结点多一个。 4. 应用软件是为特定应用领域设计的软件,例如学生成绩管理系统。 5. 系统总结构图的...

    2011年3月二级ACCESS考试真题和答案.pdf

    2. 只有一个根结点的数据结构可以是线性的,如链表或树,也可以是非线性的,如二叉树;选项B正确。 3. 在一棵二叉树中,如果只有一个叶子结点,那么它可能是高度为3的满二叉树,也可能是高度为7的不完全二叉树,所以...

    2011年3月全国计算机等级考试二级java试题及参考答案.doc

    11. 面向对象的概念:面向对象是一种以对象为中心,包含封装、继承和多态等特性的编程范式。选项A正确。 12. 字符串比较:Java中的字符串是对象,"Hello".equals("hello")会比较两个字符串的内容,不区分大小写,...

    2011年3月全国计算机等级考试二级笔试试卷C语言程序设计试题及参考答案.pdf

    循环链表和双向链表都是线性结构,因此选项C和D是错误的。 3. **二叉树**:二叉树的深度是到达最远叶子结点的路径上的边数。如果二叉树有7个结点且只有一个叶子结点,这意味着从根结点到叶子结点需要经过6条边,...

    计算机二级Access历年笔试真题及答案(2006年4月至2011年9月).pdf

    数据库是数据组织的核心,线性链表是线性表的链式表示,栈和队列是线性结构,但双向链表是非线性结构,(5)题答案为B。后序遍历二叉树时,非叶子节点在叶子节点之后访问,(6)题答案为D。满二叉树的叶子节点数量为...

    2011年9月二级VB真卷参考答案

    根据给定的文件标题“2011年9月二级VB真卷参考答案”以及描述“2011年9月二级VB真卷参考答案”,我们可以看出这份文档是关于2011年9月全国计算机等级考试二级笔试中的Visual Basic部分的试题及答案解析。下面我们将...

Global site tag (gtag.js) - Google Analytics