作为做数据挖掘的统计小硕,本科没有学过数据结构和C语言是一大遗憾,不过研究生阶段还有时间弥补哈~
上学期把数据结构粗略过了一遍,手写笔记,但由于没有C语言基础,数据结构的C语言实现大部分都过了,笔记也就不好意思没放在博客上了。寒假用较短的时间把《C Primer Plus》过了一遍,瞬间有了底气,开始看第二遍数据结构,顺便把一些总结放在博客上。
线性表是一个线性结构,它含有n>=0个结点,第一个结点称为开始结点,最后一个称为终端结点,除了这两个结点之外其余结点均有且只有一个前驱结点和一个后继结点。线性表有两组物理结构,顺序存储和链式存储。
先看顺序表,它是用一段地址连续的存储单元依次存储元素.,即在内存中占一块地,用数据元素将这块地依次填充。顺序表的优点在于可以快速存取和访问元素,但缺点很明显,由于数据元素在那块内存中是一个萝卜一个坑,元素之间没有多余的位置,故当插入和删除的时候需要移动大量的元素。
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define True 1
#define False 0
#define Listsize 100
#线性表的顺序存储结构
typedef int ElemType;
typedef struct{
ElemType Elem[Listsize];
int Lenth;
}Seqence_List
#顺序表的插入
typedef int Status;
Status InsertList(Seqence_List *L,int i,ElemType e)
{
int j;
if(i<=0||i>L->Lenth)
return ERROR;
if(L->Lenth>Listsize)
{
printf("溢出/n");return ERROR;
}
if(j<=L->Lenth)
{
for (j=L->Lenth-1;j>=i-1;j--)
L->Elem[j+1]=L->Elem[j];
}
L->Elem[i-1]=e;
L->Lenth++;
return OK;
}
而链式存储很好地解决了顺序表的问题,它是完全不同的风格。单链表用一组任意的存储单元存放数据元素,但在每个位置存储数据元素信息的同时还存储它后继元素的地址(指针)。每个数据元素不再是邻居,它们可以住的很远,但它们知道它们后继元素的地址,从而保持逻辑性。我们把存储数据元素信息的域称为数据域,把存储直接后继的域称为指针域,这两部分构成了数据元素的存储映像,称为结点。链表中第一个结点的存储地址称为头指针(无论链表是否为空,头指针均不为空),而最后一个结点的指针指向空。
#链表
typedef struct Node{
ElemType data; /*数据域*/
struct Node *next; /*指针域*/
}ListNode,*LinkList; /*LinkList是struct Node的结构体指针类型*/
#链表的插入
Status InsertList(LinkList L,int i,ElemType e)
{
int j;
j=1;
LinkList p,temp;
p=*L;
if(i<=0)
return ERROR;
while(j<i & p!=NULL)
{
p=p->next;
++j;
}
if(!p || j>i)
return ERROR;
temp=(LinkList)malloc(sizeof(Node));
temp->data=e;
temp->next=p->next;
p->next=temp;
return OK;
}
接着是整表创建
void CreateList(LinkList *L,n)
{
LinkList p;
int i=1;
srand(time(0));
*L=(LinkList)malloc(sizeof(struct Node))
if(*L==NULL)
return ERROR;
(*L)->next=NULL; /*先让头指针指向空,其它结点插入到头结点后面时能保证最后一个结点指针指向空*/
while(i<n)
{
p=(LinkList)malloc(sizeof(struct Node))
if(p==NULL)
return ERROR;
p->data=rand()%100+1;
p->next=(*L)->next;
(*L)->next=p;
i++;
}
}