C语言单链表操作

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <stdbool.h>
typedef int ElemType;

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

/*
	链表初始化 
*/
void InitList_L(LinkList L){
	L = (LinkList)malloc(sizeof(LNode));
	if(L == NULL)exit(-1);
	L->next = NULL;
}

/*
	判断链表是否为空 
*/
bool ListEmpty(LinkList L){
	if(L->next == NULL) return true;
	return false;
}

/*
	销毁单链表 
*/
void DestoryList_L(LinkList L){
	LinkList p;
	while(L){
		p = L;
		L = L->next;
		free(p);
	}
}

/*
	清空单链表 
*/ 
void ClearList_L(LinkList L){
	LinkList p, q;
	p = L->next;
	while(p){
		q = p->next;
		free(p);
		p = q;
	}
	L->next = NULL;
}

/*
	求单链表L的长度 
*/
int ListLength_L(LinkList L){
	int len = 0;
	LinkList p;
	p = L->next;
	while(p){
		p = p->next;
		len++;
	}
	return len;
}

/*
	取值:取单链表中第i个元素的内容 
*/
int  GetElem_L(LinkList L, int i, ElemType * e){
	LinkList p;
	p = L->next;
	int j = 1;
	while(p && i > j){
		p = p->next;
		j++;
	}
	if(!p || j > i ) return -1;
	*e = p->data;
	return 1;
}
/*
	查找:按值查找:根据指定数据获取数据所在位置(地址) 
*/
LinkList LocateElem_L(LinkList L, ElemType e){
	LinkList p;
	p = L->next;
	while(p && p->data != e){
		p = p->next;
	}
	return p;
}

/*
	查找:按值查找:根据指定数据获取数据所在位置(序号)
*/
int LocateElem_L2(LinkList L, ElemType e){
	LinkList p;
	p = L->next;
	int j = 1;
	while(p && p->data != e){
		p = p->next;
		j++;
	}
	if(p)return j;
	else return 0;
}

/*
	插入:在第i后结点插入新结点 
*/
int ListInsert_L(LinkList L, int i, ElemType e){
	LinkList p;
	p = L;
	int j = 0;
	while(p && i-1 > j){
		p = p->next;
		j++;
	}
	if(!p || j > i - 1) return -1;
	LinkList s = (LinkList)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return 1;
}

/*
	单链表的建立:头插法 
*/
LinkList CreateList_H(){
	int len;
	int val;
	LinkList L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	printf("请输入您要生成的链表节点个数:len=");
	scanf("%d", &len);
	int i;
	for(i = 0; i < len; i++){		
		printf("请输入第%d个节点的值:", i + 1);
		scanf("%d", &val);
		LinkList p = (LinkList)malloc(sizeof(LNode));
		p->data = val;
		p->next = L->next;
		L->next = p;
	}
	return L;
} 

/*
	单链表的建立:尾插法 
*/
LinkList CreateList_R(){
	LinkList L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	int len; 
	printf("请输入您要生成的链表节点个数:len=");
	scanf("%d", &len);
	int i;
	LinkList r = L;
	int val;
	for(i = 0; i < len; i++){		
		printf("请输入第%d个节点的值:", i + 1);
		scanf("%d", &val);
		LinkList p = (LinkList)malloc(sizeof(LNode));
		p->data = val;
		p->next = NULL;
		r->next = p;
		r = p;
	}
	return L;
}

/*
	删除:删除第i个结点 
*/
int ListDelete_L(LinkList L, int i, ElemType * e){
	LinkList p;
	p = L;
	int j = 0;
	while(p && j < i - 1){
		p = p->next;
		j++;
	}
	if(!p || j > i - 1) return -1;
	LinkList q;
	q = p->next;
	p->next = q->next;
	*e = q->data;
	free(q);
	return 1;
} 

/*
	链表的遍历 
*/
void traverse_list(LinkList L){
	LinkList p;
	p = L->next;
	while(p){
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
	return;
}
int main(){
	LinkList L;
	/***************头插法创建链表*************************/
	//L = CreateList_H();
	/***************尾插法创建链表*************************/
	L = CreateList_R(); 
	/***************销毁单链表*************************/
	//DestoryList_L(L); 
	/***************清空单链表 *************************/
	//ClearList_L(L);
	/***************求单链表的长度*************************/
	//printf("表长为:%d\n", ListLength_L(L));
	/*****取值:取单链表中第i个元素的内容,取到的放到e中 ****/
	/*
	ElemType e; 
	GetElem_L(L, 3, &e);
	printf("e = %d\n", e);	
	*/
	/*****查找:按值查找:根据指定数据获取数据所在位置(地址)****/
	//LocateElem_L(L, 3);
	/*****查找:按值查找:根据指定数据获取数据所在位置(序号)****/
	//printf("Locate = %d", LocateElem_L2(L, 45));	
	/***************求插入:在第i后结点前插入新结点***********************/
	 
	//printf("-----before------\n");
	//traverse_list(L);
	//ListInsert_L(L, 4, 999);//i等于0在第i之后插入,i等于1在i之前插入 
	//printf("-----after------\n");
	//traverse_list(L);
	//	-----before------
	//	23 43 56 67 87
	//	-----after------
	//	23 43 56 999 67 87
	//printf("ListEmpty = %d", ListEmpty(L)); //判断单链表是否为空
	int e;	
	ListDelete_L(L, 3, &e);
	traverse_list(L);
	return 0;
} 
上一篇:[作业]【C语言实现】城市链表问题


下一篇:循环链表应用——约瑟夫置换