zoukankan      html  css  js  c++  java
  • 线性表

    定义

           线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。数据元素是一个抽象的符号,其具体含义在不同的情况下一般不同。

           在稍复杂的线性表中,一个数据元素可由多个数据项(item)组成,此种情况下常把数据元素称为记录(record),含有大量记录的线性表又称文件(file)。

           顺序表:只要确定了存储线性表的起始位置,线性表中任一数据元素都可随机存取,所以顺序表存储结构是一种随机存取的存储结构。由于高级程序设计语言中的数组类型也有随机存取的特性,因此,通常都用数组来描述数据结构中的顺序存储结构。


    分类 


    实现

    顺序表

    基本操作

    /** 
     * 顺序表 
     * InitList(*L) 初始化 
     * LocateElem(L,e) 查找与e相同的元素,返回元素在表中序号 
     * ListInsert(*L,i,e) 第i个元素之前插入元素 
     * ListDelete(*L,i,*e) 删除L的第i个数据 
    * ListEmpty(L) 若为空,返回true 
     * ClearList(*L) 将L置为空表 
     * GetElem(L,i,*e) 第i个位置元素返回给e 
     */  

    代码实现

    main.c

    #include <stdio.h>
    #include "list.h" 
    
    void main()
    {
    	int i,*e=0;
    	Sqlist L;
    
    	initList(&L);//初始化顺序表
    
    	for(i=0;i<15;i++)   //循环插入i个元素
    		listInsert(&L,1,i);
    
    	//删除第5个位置的元素,并将该位置的元素赋值给e
    	listDelete(&L,5,&e);//指针作为参数传递,前面需加&
    
    	LocateElem(L,4);//查找与4相同的元素
    /***************该线上方4个函数为核心函数,下方不重要***************/
    	for(i=0;i<L.length;i++)//循环输出顺序表
    		printf("%d  ",L.elem[i]);
    	printf("
    ");
    
    	//listEmpty(L);//判断顺序表是否为空
    	//listClear(&L);//清空顺序表
    	destroyList(&L);//销毁顺序表
    }


    list.h

    #include <stdio.h>
    #include <stdlib.h>
    #define LIST_INIT_SIZE 100
    #define LISTINCREMENT 10
    
    typedef struct{
    	int *elem;
    	int length;
    	int listsize;
    }Sqlist;
    
    void initList(Sqlist *L)//构造顺序表
    {
    	L->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
    	if(!L->elem) printf("err");
    	L->length=0;
    	L->listsize=LIST_INIT_SIZE;
    }
    
    int listInsert(Sqlist *L,int i,int e)//在第顺序表i个位置之前插入e
    {
    	int * newbase,j;
    	if(i<0||i>100) return 0;
    
    	if(L->length>=L->listsize)
    	{
    		newbase=(int *)realloc(L->elem,sizeof(int)*(L->listsize+LISTINCREMENT));
    		if(!newbase)  return 0;
    		L->elem=newbase;
    		L->listsize+=LISTINCREMENT;
    	}
    	
    	for(j=L->length-1; j>=i-1; j--)//注意区分顺序表的下标和数组的下标
    		L->elem[j+1] = L->elem[j]; 
    
    	L->elem[i-1] = e;
    	++L->length;
    	return 1;
    }
    
    int listDelete(Sqlist *L,int i,int *e)//删除顺序表第i个位置的值,并用e返回
    {
    //	int p,q;
    	if(i<1||i>100) return 0;
    
    	*e=L->elem[i-1];
    	
    	for(i;i<=L->length-1;i++)
    		L->elem[i-1]=L->elem[i];
    	L->length--;
    	return 1;
    }
    
    LocateElem(Sqlist L,int e) //查找与e相同的元素
    {
    	int i;
    	for(i=0;i<L.length;i++)
    	{
    		if(L.elem[i]==e) {printf("有相同元素%d,在链表的第%d个位置
    ",e,i+1);break;}
    	}
    	if(i>=L.length) printf("没有相同元素
    ");
    }
    
    void destroyList(Sqlist *L)//销毁顺序表
    {
    	if(L->elem) free(L->elem);
    }
    
    void listClear(Sqlist *L) //清空顺序表
    {
    	int i;
    	int len=L->length;
    	for(i=0;i<len;i++) 
    	{ L->elem[i]=L->elem[len];
    	  L->length--;}
    }
    
    void listEmpty(Sqlist L) //判断顺序表是否为空
    {
    	if(L.length==0) printf("线性表为空");
    	else printf("线性表中有%d个元素
    ",L.length);
    }
    
    
    
    


    单链表

    #include<stdio.h>
    #include <stdlib.h>
    typedef struct
    {
    	int data;
    	struct LNode *next;
    }LNode,*LinkList;
    
    void init(LinkList L)//初始化链表
    {
    	int i;
    	LinkList p,q;
    	p=(LinkList)malloc(sizeof(LNode));
    	q=(LinkList)malloc(sizeof(LNode));
    	p->data=1;
    	p->next=L->next;
    	L->next=p;
    	q=p;
    	for(i=1;i<10;i++)
    	{
    		p=(LinkList)malloc(sizeof(LNode));
    		p->data=i+1;
    		p->next=NULL;
    		q->next=p;
    		q=p;
    	}
    }
    
    void convert1(LinkList L)//遍历链表
    {
    	LinkList p=(LinkList)malloc(sizeof(LNode));
    	p=L->next;
    	while(p)
    	{
    		printf("%d	",p->data);
    		p=p->next;
    	}
    }
    
    void insert(LinkList L,int pos,int e)//向链表第pos个位置插入元素e
    {
    	LinkList p=(LinkList)malloc(sizeof(LNode));
    	LinkList q=(LinkList)malloc(sizeof(LNode));
    	int i=0;
    	p=L;
    //	if(!p||i>pos-1) {printf("err");return;}
    	while(p&&i<pos-1)
    	{
    		p=p->next;
    		i++;
    	}
    	q->data=e;
    	q->next=p->next;
    	p->next=q;
    }
    
    void delete1(LinkList L,int pos)//删除链表中第pos个元素
    {
    	LinkList p=(LinkList)malloc(sizeof(LNode));
    	LinkList q=(LinkList)malloc(sizeof(LNode));
    	int i=0;
    	p=L;
    
    	while(i<pos-1)
    	{
    		p=p->next;
    		++i;
    	}
    	q=p->next;
    	p->next=q->next;
    	free(q);
    }
    
    void main()
    {
    	int pos,e;
    	LinkList L=(LinkList)malloc(sizeof(LNode));
    	L->next=NULL;
    	init(L);
    	convert1(L);
    	while(~scanf("%d %d",&pos,&e)){
    	insert(L,pos,e);
    //	while(~scanf("%d",&pos))
    //	{delete1(L,pos);
    	convert1(L);}
    }




  • 相关阅读:
    vue doubleclick 鼠标双击事件
    我是如何通过CSRF拿到Shell的
    js生成一个不重复的ID的函数的进化之路
    浅谈企业内部安全漏洞的运营(一):规范化
    如何让微信丢骰子永远只出“666”
    全能无线渗透测试工具,一个LAZY就搞定了
    关于8月31日维基解密被攻击的观察与分析
    VS2013 单元测试(使用VS2013自带的单元测试)
    解决WCF部署到IIS出现“证书必须具有能够进行密钥交换的私钥,该进程必须具有访问私钥的权限”
    VS2013 MVC Web项目使用内置的IISExpress支持局域网内部机器(手机、PC)访问、调试
  • 原文地址:https://www.cnblogs.com/wangxueliang/p/9346507.html
Copyright © 2011-2022 走看看