数据结构是相互之间存在一种或者多种特定关系的数据元素的集合
数据结构分类:数据结构为线性结构和非线性结构,线性结构:线性表,数组,栈,队列,串;非线性结构:树,图,多维数组,广义表
线性结构特点:集合中必存在唯一的一个"第一个元素",集合中必存在唯一的一个"最后的元素",除最后元素之外,其它数据元素均有唯一的"后继",除第一元素之外,其它数据元素均有唯一的"前驱"。数据结构中线性结构指的是数据元素之间存在着“一对一”的线性关系的数据结构。
非线性结构:一个结点元素可能对应多个直接前驱和多个后继。
线性表:
是最常用且最简单的一种数据结构,一个线性表是由n个数据元素的有限序列
线性表仅仅是逻辑上的定义而已,链表和顺序表都满足线性表的定义,只是实现方式不一样,顺序表采用顺序存储方式,内存中开辟的地址是连续的,而链表采用链式存储的方式,地址是可以不连续的
线性表的实现之顺序表:
typedef struct {
int *elem;// 存储空间基址
int length;//当前长度
int listsize;//当前分配的存储容量 以sizeof(int)为单位
}Sqlist;
线性表的实现之单链表:
typedef struct Lnode{
int data;
struct Lnode*next;
}Lnode,*LinkList;
voidCreateList_L(LinkList&L,intn){
//逆序输入n个元素的值,建立带表头结点的单链线性表L
L = (LinkList)malloc(sizeof(Lnode));
if(L==NULL){
printf("申请空间失败!");
exit(0);
}
L->next = NULL; //建立了一个带头结点的单链表
LinkListtemp = L;
for(inti=n;i>0;i--){//输入单链表元素
LinkList p = (LinkList)malloc(sizeof(Lnode));
p->next=NULL;//先清空
p->data=0; //先清空
scanf("%d",&(p->data));
temp->next= p;
temp = temp->next;
}
}
//带头结点的单链表求表长
int LinkedListLength(LinkListL){
Lnode*p; //p需要声明为LNode类型
p=L->next;
intj=0;
while(p!=NULL){
j++;
p=p->next; //将p向下移动一个结点
}
return j;
}
void reserveData(LinkList L)//遍历单链表{
Lnode*p; //p需要声明为LNode类型
p=L->next;
while(p!=NULL) {
printf("%d",p->data);
p=p->next; //将p向下移动一个结点
}
}
void ListInsert_L(LinkList&L,int i,int e){//在带头结点的单链表L中第i个位置之前插入元素e
LinkListp = L;intj=0;
while(p&&j<i-1) {
p = p->next;
++j;
}
if(!p||j>i) {
return;
}
LinkList s=(LinkList)malloc(sizeof(Lnode));
s->data=e;
s->next= p->next;
p->next= s;
return;
}
int main(int argc,const char* argv[]) {
// insert code here...
std::cout<<"hello world"<<"\n";
LinkList L;
CreateList_L(L, 4);
printf("%d",LinkedListLength(L));
printf("%d",L->next->next->data);
return 0;
}
循环链表:
双向链表: