• MOOC 2.1 线性表及其实现


    1. 顺序表

    #include <cstdio>
    typedef struct LNode *List;
    struct LNode
    {
    	ElementType Data[MAXSIZE];
    	int Last;
    };
    
    struct LNode L;
    List PtrL;
    
    // 1. 初始化(建立空的顺序表)
    List MakeEmpty()
    {
    	List PtrL;
    	PtrL = (List )malloc(sizoef(struct LNode) );
    	PtrL->Last = -1;
    	return PtrL;
    }
    
    // 2. 查找
    int Find(ElementType X, List PtrL)
    {
    	int i = 0;
    	while( i <= PtrL->Last && PtrL->Data[i] != X)
    		i ++;
    	if(i > PtrL->Last)	return -1;	// 如果没有找到, 返回-1 
    	else	return i;	// 找到后返回的是存储位置 
    } 
    
    // 3. 插入(第i(1<=i<=n+1)个位置上插入一个值为X的新元素)
    void Insert(ElementType X, int i, List PtrL)
    {
    	int j;
    	if(PtrL->Last == MAXSIZE - 1)	// 表空间已满, 不能插入 
    	{
    		printf(" 表满 
    ");
    		return ;
    	}
    	if(i < 1 || i > PtrL->Last + 2)	// 检查插入位置的合法性 
    	{
    		printf(" 位置不合法 
    ");
    		return ;
    	}
    	for(j = PtrL->Last; j >= i - 1; -- j)
    	{
    		PtrL->Data[j + 1] = PtrL->Data[j];	// 将ai到an倒序向后移动 
    	}
    	PtrL->Data[i - 1] = X;		// 新元素插入 
    	PtrL->Last ++;	// last仍指向最后元素 
    	return ;
    } 
    
    // 4. 删除 (删除表第i(1<=i<=n)个位置上的元素)
    void  Delete(int i, List PtrL)
    {
    	int j;
    	if(i < 1 || i > PtrL->Last + 1)	// 检查空表及删除位置的合法性 
    	{
    		printf("不存在第%d个元素
    ", i);
    		return ;
    	}
    	for(j = i; j <= PtrL->Last; ++ j)
    	{
    		PtrL->Data[j - 1] = PtrL->Data[j];	// 将ai+1~an顺序向前移动 
    	}
    	PtrL->Last --;	// Last仍指向最后元素 
    	return ;
    }
    

      

    2. 链表

    #include <cstdio>
    typedef struct LNode *List;
    struct LNode
    {
    	ElementType Data;
    	List Next;
    };
    
    struct Lnode L;
    List PtrL;
    
    // 1. 求表长
    int Length(List PtrL)
    {
    	List p = PtrL;	// p指向表的第一个结点
    	int j = 0;
    	while( p )
    	{
    		p = p->Next;
    		j ++;	// 当前p指向的是第j个结点 
    	}
    	return j;
    } 
    
    // 2. 查找
    // (1) 按序号查找: FindKth;
    List FindKth(int K, List PtrL)
    {
    	List p = PtrL;
    	int i = 1;
    	while(p != NULL && i < K)
    	{
    		p = p->Next;
    		i ++;
    	}
    	if(i == K)	return p;	// 找到第K个, 返回指针 
    	else	return NULL;	// 否则返回空 
    } 
    // (2)	按值查找: Find
    List Find(ElementType X, List PtrL)
    {
    	List p = PtrL;
    	while(p != NULL && p->Data != X)
    	{
    		p = p->Next;
    	}
    	return p;
    } 
    
    // 3. 插入( 在第i-1(1<=i<=n+1)个结点后插入一个值为X的新结点)
    List Insert(ElementType X, int i, List PtrL)
    {
    	List p, s;
    	if(i == 1)		// 新结点插入在表头 
    	{
    		s = (List )malloc(sizeof(struct LNode));	// 申请 填装结点 
    		s->Data = X;
    		s->Next = PtrL;
    		return s;	// 返回新表头指针 
    	}
    	p = Find(i - 1, PtrL);	// 查找第i-1个结点 
    	if(p == NULL)	// 第i-1个不存在, 不能插入 
    	{
    		printf(" 参数i错 
    ");
    		return NULL; 
    	}
    	else
    	{
    		s = (List )malloc(sizeof(struct LNode));	// 申请 填装结点 
    		s->Data = X;
    		s->Next = p->Next;	// 新结点插入在第i-1个结点的后面 
    		p->Next = s;
    		return PtrL;
    	}
    } 
    
    // 4. 删除
    List Delete(int i, List PtrL)
    {
    	List p, s;
    	if(i == 1)	// 若要是删除的是表的第一个结点 
    	{
    		s = PtrL;	// s指向第一个结点 
    		if(PtrL != NULL)	PtrL = PtrL->Next;	// 从链表中删除 
    		else	return NULL;
    		free(s);	// 释放被删除结点 
    		return PtrL;
    	}
    	p = FindKth(i - 1, PtrL);	// 查找第i-1个结点 
    	if(p == NULL)
    	{
    		printf("第%d个结点不存在", i - 1);
    		return NULL;
    	}
    	else if(p->Next == NULL)
    	{
    		printf("第%d个结点不存在", i);
    		return NULL;
    	}
    	else
    	{
    		s = p->Next;	// s指向第i个结点 
    		p->Next = s->Next;	// 从链表中删除 
    		free(s);		// 释放被删除结点 
    		return PtrL;
    	}
    }
    

      

  • 相关阅读:
    eclipse中开发android程序时,打开layout配置文件自动关闭的问题
    成功用WAP登陆ZBlog发表文章
    java环境变量配置
    Eclipse快捷键大全
    Android SDK 2.2 开发环境搭建
    用EnterpriseLibrary来自动管理与数据库的连接
    一个普通网站发展成大型网站过程中的架构演变史
    有关Silverlight TabControl组件的研究
    有关Silverlight浮动窗体组件的研究
    强大的DataGrid组件[9]_自定义头模板
  • 原文地址:https://www.cnblogs.com/mjn1/p/11429870.html
Copyright © 2020-2023  润新知