zoukankan      html  css  js  c++  java
  • 数据结构实验一--单链表的基本操作的算法

    一、实验环境

          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);
    }
    













  • 相关阅读:
    HTTP RFC解析
    Symfony框架的笔记
    Swoole学习总结1
    PHP Socket 学习笔记一
    Js解决解除多次Ajax请求的事件
    Python 操作串口
    python 实现微信自动回复和好友签名分析
    杂谈1
    Vue.js 功课1
    微信API demo
  • 原文地址:https://www.cnblogs.com/riskyer/p/3358168.html
Copyright © 2011-2022 走看看