typedef重命名数据类型
第二种声明方式可读性更强
LinkList和LNode*的不同用法
#include
//定义单链表结点类型
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//查找单链表中的某一个位置的数
LNode* GetElem(LinkList L,int i){
int j=1;
LNode *p=L->next;
if(i==0)
return L;
if(i<1)
return NULL;
if(p!=NULL&&j<i){
p=p->next;
j++;
}
return p;
}
//定义单链表结点类型
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//初始化一个空的单链表
bool InitList(LinkList &L){
L=NULL;
return true;
}
//判断单链表是否为空
bool Empty(LinkList L){
return(L==NULL);
}
//定义单链表结点类型
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//初始化一个空的单链表
bool InitList(LinkList &L){
L=(LNode*)malloc(sizeof(LNode));
if(L==NULL)
return false;
L->next=NULL;
return true;
}
//判断单链表是否为空
bool Empty(LinkList L){
return(L->next==NULL);
}
int main(){
LinkList L;
InitList(L);
return 0;
}
//插入操作
bool ListInsert(LinkList &L,int i,int e){
if(i<1)
return false;
LNode *p;
p=L;
int j=0;
//找到i-1位置
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}
//开拓新区域
LNode *s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
bool ListInsert(LinkList &L,int i,int e){
if(i<1)
return false;
if(i==1){//不同的地方
LNode*s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=L;//因为L没有next所以直接等于
L=s; //头指针指向新结点
return true;
}
LNode *p;
p=L;
int j=0;
//找到i-1位置
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}
//开拓新区域
LNode *s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
bool InsertNextNode(LNode *p,int e){
if(p==NULL)
return false;
//开拓新区域
LNode *s=(LNode*)malloc(sizeof(LNode));
if(s==NULL)
return false;
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
前面区域无法访问,只能把头结点传入
将p的值赋值给s,再将插入的值赋值给p
bool InsertPriorNode(LNode *p,int e){
if(p==NULL)
return false;
//开拓新区域
LNode *s=(LNode*)malloc(sizeof(LNode));
if(s==NULL)
return false;
s->next=p->next;
p->next=s;
s->data=p->data;
p->data=e;
return true;
}
bool ListDelete(LinkList &L,int i,int &e){
if(i<1)
return false;
LNode *p;
p=L;
int j=0;
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}
if(p==NULL)
return false;
if(p->next==NULL)
return false;
LNode *q=p->next;//q指向被删除的结点
e=q->data;//保存删除的值
p->next=q->next;//断开q
free(q);//销毁q
return true;
}
LNode *GetElem(LinkList L,int i){
if(i<1)
return false;
LNode *p;
p=L;
int j=0;
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}
return p;
}
LinkList List_TailInsert(LinkList &L){
int x;
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
LNode *s,*r=L;
scanf("%d",&x);
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
r->next=s;
s->data=x;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return L;
}
LinkList List_TailInsert(LinkList &L){
LNode *s;
int x;
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
scanf("%d",&x);
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
bool InitDLinkList(DLinkList &L){
L=(DNode*)malloc(sizeof(DNode));
L->next=NULL;
L->prior=NULL;
return true;
}
bool InsertNextDNode(DNode *p,DNode *s){
s->next=p->next;
if(p->next!=NULL)
p->next->prior=s;
s->prior=p;
p->next=s;
}
双链表,在尾部插入数据时,双链表会在第二行p->next->prior=s出错,因为p->next为空,但是循环后就不为空了
#include
#define MaxSize 10
//常规
struct Node{
int data;
int next;
};
//课本
typedef struct{
int data;
int next;
}SLinkList[MaxSize];
int main(){
struct Node x;
printf("%d\n",sizeof(x));
//常规
struct Node a[MaxSize];
printf("%d\n",sizeof(a));
SLinkList b;
printf("%d\n",sizeof(b));
}
优点:
增、删操作不需要大量移动元素
缺点:
不能随机存取,只能从头结点开始依次往后查找;容量固定不可变
适用场景:
①不支持指针的低级语言;
②数据元素数量固定不变的场景(如操作系统的文件分配表FAT)