数据结构实验一--单链表的基本操作的算法

一、实验环境

      VC++ 6.0  

      Windows XP/7

二、程序基本设计

    (一)、存储结构的类型定义

typedef struct LNode	/*定义单链表结点类型*/
{
	ElemType data;
    struct LNode *next;
} LinkList;

(二)、单链表示意图




(三)、项目组成图



(四)、在项目中建立algo2_2.cpp的程序文件

其中包含的函数原型及功能是:

详情见代码,略去,,几百字。。


(五)、在实验一的项目中,建立名为exp2_2.cpp程序文件

其中包括的内容为:

详情见代码,略去几十字。。。。

(六)、实验一的项目的模块结构,及函数调用关系图




三、程序代码

代码如下:

/*文件名:algo2-2.cpp*/
#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
typedef struct LNode	/*定义单链表结点类型*/
{
	ElemType data;
    struct LNode *next;
} LinkList;
void InitList(LinkList *&L)
{
	L=(LinkList *)malloc(sizeof(LinkList));  	/*创建头结点*/
	L->next=NULL;
}
void DestroyList(LinkList *&L)
{
	LinkList *p=L,*q=p->next;
	while (q!=NULL)
	{
		free(p);
		p=q;
		q=p->next;
	}
	free(p);
}
int ListEmpty(LinkList *L)
{
	return(L->next==NULL);
}
int ListLength(LinkList *L)
{
	LinkList *p=L;int i=0;
	while (p->next!=NULL)
	{
		i++;
		p=p->next;
	}
	return(i);
}
void DispList(LinkList *L)
{
	LinkList *p=L->next;
	while (p!=NULL)
	{
		printf("%c",p->data);
		p=p->next;
	}
	printf("
");
}
int GetElem(LinkList *L,int i,ElemType &e)
{
	int j=0;
	LinkList *p=L;
	while (j<i && p!=NULL)
	{
		j++;
		p=p->next;
	}
	if (p==NULL || i<1)     // 当超出上界或者下界时,查询失败
	{
		printf("您输入的元素位置数据不合法!
");
		return 0;
	}
	else
	{
		e=p->data;
		return 1;
	}
}
int LocateElem(LinkList *L,ElemType e)
{
	LinkList *p=L->next;
	int n=1;
	while (p!=NULL && p->data!=e)
	{
		p=p->next;
		n++;
	}
	if (p==NULL)
		return(0);
	else
		return(n);
}
int ListInsert(LinkList *&L,int i,ElemType e)
{
	int j=0;
	LinkList *p=L,*s;
	while (j<i-1 && p!=NULL)
	{
		j++;
		p=p->next;
	}
	if (p==NULL || i<=0)	/*未找到第i-1个结点*/
	{
		printf("插入失败!
");
		return 0;
	}
	else			/*找到第i-1个结点*p*/
	{
		s=(LinkList *)malloc(sizeof(LinkList));	/*创建新结点*s*/
		s->data=e;								
		s->next=p->next;						/*将*s插入到*p之后*/
		p->next=s;
		printf("插入完成!
") ;
		return 1;
	}
}
int ListDelete(LinkList *&L,int i,ElemType &e)
{
	int j=0;
	LinkList *p=L,*q;
	while (j<i-1 && p!=NULL)
	{
		j++;
		p=p->next;
	}
	if (p==NULL || i <1 ||q==NULL )				/*未找到第i-1个结点*/
	{
		return 0;
	}
	else						/*找到第i-1个结点*p*/
	{
		q=p->next;              /*q指向要删除的结点*/
        e=q->data;  
		p->next=q->next;		/*从单链表中删除*q结点*/
	    free(q);				/*释放*q结点*/
	    return 1;
	}
}



/*文件名:exp2-2.cpp*/
#include <stdio.h>
#include <malloc.h>

typedef char ElemType;

typedef struct LNode	/*定义单链表结点类型*/
{
	ElemType data;
    struct LNode *next;
} LinkList;

extern void InitList(LinkList *&L);
extern void DestroyList(LinkList *&L);
extern int ListEmpty(LinkList *L);
extern int ListLength(LinkList *L);
extern void DispList(LinkList *L);
extern int GetElem(LinkList *L,int i,ElemType &e);
extern int LocateElem(LinkList *L,ElemType e);
extern int ListInsert(LinkList *&L,int i,ElemType e);
extern int ListDelete(LinkList *&L,int i,ElemType &e);
void main()
{
	int pos;
	LinkList *h;
	ElemType e;
	char ele;
	printf("(1)初始化单链表h
");
	InitList(h);

	printf("
(2)依次采用尾插法插入a,b,c元素
");
	ListInsert(h, 1, 'a');
	ListInsert(h, 2, 'b');
	ListInsert(h, 3, 'c');

	printf("
(3)输出单链表h:");
	DispList(h);

	printf("
(4)单链表h长度=%d
",ListLength(h));

	printf("
(5)单链表h为%s
",(ListEmpty(h)?"空":"非空"));

Sur:printf("
(6)请输入你要查询的数据元素的位置(数字):");
	scanf("%d", &pos) ;
	if(GetElem(h,pos,e))
	{
		printf("单链表h的第%d个元素=%c
", pos, e);
	}
	else
	{
		printf("查询失败!
");
SurEle:	printf("你是否要继续查询?(Y/N)") ;
		getchar();
		scanf("%c", &ele) ;
		switch (ele)
		{
		case 'Y':
		case 'y': goto Sur ; break;
		case 'N':
		case 'n': printf("您选择放弃再次查询!
") ; break;
        default: printf("您输入的数据不合法!请重新输入:
"); goto SurEle ; break;
		}
	}

SurCon:printf("
(7)请输入你要查找的数据元素的值:") ;
	getchar();
	scanf("%c", &e) ;
	if (LocateElem(h,e))
	{
		printf("查找成功,元素%c的位置=%d
", e, LocateElem(h,e));
	} 
	else
	{
		printf("查询失败!你输入的数据元素的值不存在!
") ;
SurConEle:	printf("你是否要继续查询?(Y/N)") ;
		getchar();
		scanf("%c", &ele) ;
		switch (ele)
		{
		case 'Y':
		case 'y': goto SurCon ; break;
		case 'N':
		case 'n': printf("您选择放弃再次查询!
") ; break;
        default: printf("您输入的数据不合法!请重新输入:
"); goto SurConEle ; break;
		}
	}

	printf("
(8)请输入你要插入的数据元素的位置和数据元素值(以逗号隔开):");
	scanf("%d,%c", &pos, &e);
	if (ListInsert(h, pos, e))
	{
			printf("输出成功插入元素后的单链表h:");
			DispList(h);
	}

Dle:printf("
(10)请输入你要删除的数据元素的位置:");
	//getchar();
	scanf("%d", &pos) ;
	if(ListDelete(h,pos,e))
	{
		printf("删除成功!你删除的位置的数据元素值为%c
", e) ;
		printf("输出成功删除元素后单链表h:");
		DispList(h);
		printf("你是否要继续删除?(Y/N)") ;
		getchar();
		scanf("%c", &ele) ;
		switch (ele)
		{
		case 'Y':
		case 'y': goto Dle ; break;
		case 'N':
		case 'n': printf("您选择不再继续删除!
") ; break;
        default: printf("您输入的数据不合法!请重新输入:
"); goto Dle ; break;
		}
	}
	else
	{
		printf("删除失败!请检查你输入的数据元素的位置!
") ;
DleEle:	printf("你是否要继续再次尝试删除?(Y/N)") ;
		getchar();
		scanf("%c", &ele) ;
		switch (ele)
		{
		case 'Y':
		case 'y': goto Dle ; break;
		case 'N':
		case 'n': printf("您选择放弃尝试删除!
") ; break;
        default: printf("您输入的数据不合法!请重新输入
"); goto DleEle ; break;
		}

	}
	printf("
(12)释放单链表h
");
	DestroyList(h);
}













原文地址:https://www.cnblogs.com/riskyer/p/3358168.html