线性链表(单链表)

数据结构 专栏收录该内容
50 篇文章 1 订阅

/******************************************************************

线性表的单链表存储结构

******************************************************************/

typedef struct LNode{

ElemType  data; //结点的数据域

struct LNode*next;//结点的指针域

}LNode, *LinkList;


/******************************************************************

 取链表中的某个元素的函数GetElem函数实现

******************************************************************/


Status GetElem_L(LinkList L, int i, ElemType &e){

// L为带头结点的单链表的头指针

// 当第i个元素存在时,其赋值给e并返回OK,否则返回ERROR

p = L->next; j = 1;// 初始化,p指向第一个结点,j为计数器

while( p && j < i){// 顺指针向后查找,直到p指向第i个元素或p为空

p = p->next; ++j;

}

if(!p || j > i) return ERROR;// 第i个元素不存在

e = p->data;// 取第i个元素

return OK;

}//GetElem_L

/******************************************************************

 单链表中的插入实现函数ListInsert_L

******************************************************************/

Status ListInsert_L(LinkList & L, int i, ElemType e){

// 在带头结点的单链表L中第i个位置之前插入元素e

p = L; j = 0;

while(p && j < i -1){ p = p -> next; ++j; }// 寻找第i - 1个结点

if( !p || j > i - 1)return ERROR;// i小于1或者大于表长+1

s = (LinkList)malloc(sizeof(LNode));// 生成新结点

s->data = e;s->next = p->next;// 插入L中

p->next = s;

return OK;

} // ListInsert_L

/******************************************************************

 单链表中的删除实现函数ListDelete_L

******************************************************************/

Status ListDelete_L(LinkList &L, int i, ElemType &e){

// 带头结点的单链表L中,删除第i个元素,并由e返回其值

p = L; j = 0;

while(p->next && j < i - 1){//寻找第i个结点,并令p指向其前驱

p = p->next; ++j

}

if(!(p->next) || j > i - 1)return ERROR;//删除位置不合理

q = p->next;p->next = q->next;// 删除并释放结点

e = q->data;free(q);

return OK;

} // ListDelete_L

/******************************************************************

 从表尾到表头逆向建立单链表的实现CreateList_L

******************************************************************/

int CreateList_L(LinkList &L, int n){

// 逆位序输入n个元素的值,建立带表头结点的单链表L

L = (LinkList)malloc(sizeof(LNode));

L->next = NULL;// 先建立一个带头结点的单链表

for(i = n; i > 0; i--){

p = (LinkList)malloc(sizeof(LNode));// 生成新结点

scanf(&p->data);// 输入元素值

p->next = L->next; L->next = p;// 插入到表头

}

} // CreateList_L

/*
 *ʵ 
 */
#include 
   
    
#include 
    
     
#include 
     
      
#include 
      
       

#ifndef 	FALSE
#define		FALSE 	(0)
#endif

#ifndef 	TRUE
#define 	TRUE	(!FALSE)
#endif

int 	length;

typedef int ElemType;	
/**/
typedef struct LNode{
	ElemType 		data;
	struct LNode	*next;
}LNode, *LinkList;

ElemType *next_e;

/**/
LinkList CreateList_L(LinkList L, int n)
{
	printf("please input the length of the LinkList you want to create:");
	scanf("%d", &n);
	LinkList p;
	int 	 i;

	L = (LinkList)malloc(sizeof(LNode));
	if(L == NULL){
		printf("can't create list.\n");
		exit(0);
	}
		
	L->next = NULL;		//ͷĵ
	for(i = n; i > 0; i--)
	{
		p = (LinkList)malloc(sizeof(LNode)); //½
		if(p == NULL){
			printf("can't create list.\n");
			exit(0);
		}
		scanf("%d", &p->data);	
		p->next = L->next;
		L->next = p;
	}
	return L;
}

/*ԱL, ͷڵu052Aͷ洢ռ*/
int DestroyList(LinkList L)
{
	LinkList q;
	while(L->next){
		q = L->next;
		free(L->next);	
		L = q;
	}
	return 1;
}

/*LΪձ*/
LinkList ClearList(LinkList L)
{
	LinkList p, q;

	p = L->next;	//pָһ
	while(p){
		q = p->next;
		free(p);	//ͷſռ
		p = q;	
	}
	L->next = NULL;	//ͷָΪ,һձ

	return L;
}

/*LΪձ,
      
     
    
   



  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值