第三篇:线性表的链式表示(单链表)

//考研复习(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;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值