线性表

定义

       线性表(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("\n");

	//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个位置\n",e,i+1);break;}
	}
	if(i>=L.length) printf("没有相同元素\n");
}

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个元素\n",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\t",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);}
}




posted @ 2018-02-08 10:50  王雪亮  阅读(162)  评论(0编辑  收藏  举报