1.线性表和链表的结点定义、表定义不同,因而操作不同 比较: ①线性表定义:
#define LIST_INIT_SIZE 80
#define LISTINCREMENT 10 //define后面不加分号
typedef char ElemType;
typedef struct{
ElemType *elem;
int length;
int listsize;
}SqList;
②链表结点定义:
typedef struct Node{
ElemType data;
Stuct Node *next;
}Node,*LinkList //LinkList为结构指针
链表定义:
typedef struct{
Link head,tail; //头结点,尾结点
int len;//链表长度
Link current;//当前访问节点
}LinkList;
2.线性表的基本操作 ①初始化(创建线性表)
Status InitList_Sq(Sqlist &L){
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!e) exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
②定位查询
int LocateElem_Sq(Sqlist &L,ElemType e,Status(*compare)(ElemType,ElemType)){
int i=1;
p=L.elem;
if(i=q;--p) //数组从零开始,减一也表示最后一个元素
*(P+1)=*p //p变为P+1,右结合
*q=e;
++L.length;
return OK;
}
④删除
Status ListDelete(SqList &L,int pos,ElemType e){
if(posL.length) exit(ERROR);
P=&(L.elem[pos-1]);
e=*p;
q=L.elem+L.length-1;
for(++p;ppos-1) return ERROR;
S=(LinkList)malloc(sizeof(LNode));
s_>next=p_>next;
s_>data=e;
p_>next=s;
return OK;
}
②元素查找(位序i)
Status GetElem_L(Linklist L,int pos,ElemType e){
p=_>L.next;
j=1;
if(p&&jnext;++j;}
if(!p||j>pos) return ERROR;
e=p_>data;
return OK;
}
③元素删除
Status ListDelete_L(LinkList L,int pos,ElemType e){
p=L;
j=0;
while(p&&jnext;++j;}
if(!(p_>next)||j>pso-1) return ERROR;
q=p_>next;p_>next=q_>next;
e=q_>data;
free(q);
return OK;
}
④建造链表 ( 建立头指针、一个结点;相当于在两个结点中插入一个新节点 )
void CreatList_L(LinkList &L,int n){
L=(LinkList)malloc(sizeof(LNode));
L_>next=NULL; //建立头节点
for(i=n;i>0;--i){
p=(LinkList)malloc(sizeof(LNode));
scanf("&d",&p_>data);
p_>next=L_>next;L_>next=p;
}
}
⑤插入其后 (插入元素e在当前指针后 )
Status InsAfter(LinkList &L,ElemType e){
if(!L.current) return ERROE;
if(!MakeNode(s,e)) return ERROR;//已封装
s_>next=L.current_>next;
L.current_>next=s;
return OK;
}
⑥删除其后
Status DelAfter(LinkList &L,ElemType &e){//删除当前指针之后的结点
if(!current) return ERROR;
q=L.current_>enxt;
L.current_>next=q_>next;
e=q_>data;
Free(q);
}
7.其它 双向链表:
typedef struct DuLNode{
ElemType data;
struct DuLNode *prior; //指向前驱的指针域
struct DuLNode *next; //指向后继的指针域
}DuLNode,*DuLinkList;