//考研复习(3):线性表的链式表示(单链表)
----------------------------------------------------------------------------
//结点类型的描述
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
备注:typedef 是为数据类型定别名的关键字,
所以,struct LNode* 的别名是LinkList,
struct LNode的别名是LNode。链式存储中
线性表就是一个结点类型的指针变量!!!
----------------------------------------------------------------------------
//头插法建立单链表
LinkList List_HeadInsert(LinkList &L){
LNode *s,
int x;
L=(LinkList)malloc(sizeof(LNode)); //创建头结点
L->next=Null; //初始为空链表
scanf("%d",&x); //输入结点的值
while(x!=999){ //输入999时候表示输入结束
s=(LNode*)malloc(sizeof(LNode)); //创建新的结点
s->data=x;
s->next=L->next;
L->next=s; //将新节点插入L中
scanf("%d",&x);
}
return L;
}
备注:这里用到了二重指针知识,因为L本身就是
一个链表,头插法需要改变它,所以要传地址
---------------------------------------------------------------------------
//尾插法建立单链表
LinkList List_TailInsert(LinkList &L){
int x;
L=(LinkList)malloc(sizeof(LNode));
LNode*s,*r=L; //r为指向尾部的指针
scanf("%d",&x); //输入结点的值
while(x!=999){ //输入999时候表示输入结束
s=(LNode*)malloc(sizeof(LNode)); //创建新结点
s->data=x;
r->next=s; //将新结点插入到最后
r=s; //将r指向表尾
scanf("%d",&x);
}
r->next=Null;
return L;
}
----------------------------------------------------------------------------
//按顺序查找结点值
LNode *GetElem(LinkList L,int i){
int j=1; //计数,初始值为1
LNode *P=L->next; //头结点指针赋给p
if(i=0)
return L; //若i等于0,则返回头结点
if(i<i)
return Null; //若i无效,则返回NULL
while(p&&j<i){ //从第一个结点开始找到第i个结点
p=p->next;
j++;
}
return p; //返回第i个结点的指针,若i大于表长,P=NULL,返回p就行
}
------------------------------------------------------------------------------
//按值查找结点
LNode *LocateElem(LinkList L,ElemType e){
LNode *p=L->next; //p指向第一个结点
while(p!=Null&&p->data!=e) //查找data为e的结点
p=p->next; //找到后返回该点指针,否则返回NULL
return p;
}
------------------------------------------------------------------------------
//插入结点操作
(1)前插法
p=GetElem(L,i-1); //找到第i-1给结点
s->next=p->next; //在其后面插入s;
p->next=s;
(2)后插法
s->next=p->next; //此时p指向第i个结点
p->next=s;
temp=p->data; //交换数据域部分
p->data=s->data;
s->data=temp;
-----------------------------------------------------------------------------
//删除结点操作
p=GetElem(L,i-1); //查找删除结点的前驱结点
q=p->next; //让q指向被删除结点
p->next=q->next; //让*q结点从链中断开
free(q); //释放结点的存储空间
//另一种方法
q=p->next; //此时p是要删除的结点,q为i+1结点
p->data=q->data;//将i+1结点值给i
p->next=q->next;//删除i+1结点
free(q); //释放结点的存储空间
-----------------------------------------------------------------------------
//求表的长度:不算头结点
int GetListLength(LinkList L){
LNode *p=L->next;
int count=0;
while(p!=NULL){
p=p->next;
count++;
}
return count;
}