顺序线性表:
数组来表达线性表(联系:1:1)
缺点:不能扩容,增加和删除麻烦
注:在结构中一般有指针来表达联系
struct list
{
type data;
int index;//下标
};
ps:其实就是一个数组。。。。。不过逻辑上不是,逻辑和实际物理还是有区别
链表:
所有元素没有紧挨在一起,但每个元素有联系
有方向的链表:
单向链表
struct node
{
data;//数据区
struct node* next;地址
};
双向链表
循环链表:
单向循环链表
双向循环链表
插入节点的步骤:
1、创建节点并填充内容
2、修改关系
为了空间利用率提高,没有头节点,只是用一个指针变量在链表头,当需要修改头节点时,函数中需要用到二级指针
#include<stdio.h>
#include<stdbool.h> //主要宏定义 char->bool 0->false 1->true
#include<stdlib.h> //malloc函数
typedef int dataType;
//定义节点类型
typedef struct Node
{
dataType data; //数据域
struct Node* next;//指向域
}node,*pnode;
//增加
bool add(pnode* phead,int d)
{
//1申请节点空间,并填充
pnode pn=malloc(sizeof(node)/*Byte*/);
if(NULL==pn)//申请节点失败
return false;
pn->data=d;
//修改指向域
/*
if(NULL==*phead)
{
//pn->next=*phead;
//*phead=pn;
}
else
{
//pn->next=*phead;
//*phead=pn;
}
*/
pn->next=*phead;
*phead=pn;
return true;
}
//查找Key节点所在链表的位置
pnode find(pnode ph,int key)
{
while(NULL!=ph && ph->data!=key)
ph=ph->next;
return ph;
}
//遍历
void list(pnode ph)
{
while(NULL!=ph)
{
printf("%d ",ph->data);
ph=ph->next;
}
printf("\n");
}
//修改节点元素内容
bool modify(pnode ph,int old,int nd)
{
pnode pk=NULL;
if((pk=find(ph,old))==NULL)
return false;
pk->data=nd;
return true;
}
//倒置--递归
void rease(pnode* pphead,pnode first,pnode second,pnode third)
{
//如果second指向有元素,则修改指向域
if(NULL!=second)
second->next=first;
//second为尾节点
if(NULL==third)//将最后一个节点成为头节点
{
*pphead=second;
return;
}
//递归
rease(pphead,second,third,third->next);
}
//删除
bool drop(pnode* pphead,int key)
{
//ploc用于查找key所在元素位置,first key之前
pnode first=NULL,ploc=*pphead;
while(ploc!=NULL && ploc->data!=key)
{
first=ploc;
ploc=ploc->next;
}
if(ploc==*pphead)//删除头节点
{
*pphead=ploc->next;
free(ploc);
return true;
}
else if(ploc!=NULL)//非头节点
{
first->next=ploc->next;
free(ploc);
return true;
}
return false;
}
int main()
{
//定义指针域:存储第一个节点的地址
pnode head=NULL;
//插入
add(&head,1);
add(&head,2);
add(&head,3);
add(&head,4);
list(head);
/*
//查找
if(find(head,4)!=NULL)
{
printf("1存在链表中\n");
}
else
printf("1不存在链表中\n");
//修改
//modify(head,2,100);
//list(head);
*/
//倒置---1,2为空,3指向头节点
//rease(&head,NULL,NULL,head);
//list(head);
drop(&head,4);
list(head);
return 0;
}