单链表

定义:单链表是用一组任意的存储单元存放线性表的元素,这组存储单元可以连续,也可以不连续,甚至可以零散的分布在内存的任意位置。

单链表的实现

#include<stdio.h>
#include<stdlib.h>

//定义单链表的数据类型,设置为int 型
typedef int DataType;
//定义单链表的结构体
typedef struct Node{
	DataType data;
	struct Node * next;
}Node;

//单链表的初始化,生成只有头节点的空单链表
Node * InitList(){
	Node * first = (Node * )malloc(sizeof(Node));
	first->next = NULL;
	return first;
}

//判空操作,判断单链表是否只有头结点
int Empty(Node * first){
	
	if(first->next == NULL) return 1;
	else return 0;
}

//遍历操作
void PringtList(Node * first){
	
	Node * p = first->next;
	while(p!=NULL){
		printf("%d\n",p->data);
		p = p->next;
	}
}

//求链表的长度
int Length(Node * first){
	
	Node * p = first->next;
	int count = 0;
	while(p!=NULL){
		
		p = p->next;
		count++;
	}
	return count;
}

//按值查找
int Locate(Node * first,DataType x){
	
	Node * p = first->next;
	int count = 1;
	while(p!=NULL){
		
		if(p->data == x) return count;
		p = p->next;
		count++;
	}
	return 0;
}

//按位查找
int Get(Node * first,int n,DataType * ptr){
	
	Node * p = first->next;
	int count = 1;
	while( count < n && p != NULL)
	{
		p = p->next;
		count++;
		
	}
	if( p == NULL) {
		printf("位置错误,查找失败\n");
		return 0;
	}else{
		
		*ptr = p->data;
		return 1;
	}
		
	
	
}

//插入操作
int Insert(Node * first,int i,DataType x){
	
	Node * s = NULL;
	Node * p = first;
	int count = 0;
	while(p != NULL && count < i-1){
		
		p = p->next;
		count++;
	}
	if(p == NULL){
		
		printf("位置错误,插入失败\n");
		return 0;
	}else{
		
		s = (Node *)malloc(sizeof(Node));
		s->data = x;
		s->next = p->next;
		p->next = s;
		return 1;
	}
	
	
	
}

//建立单链表,使用尾插法
Node * CreateList(DataType a[],int n){
	
	Node * s = NULL;
	Node * r = NULL;	//尾指针初始化
	Node * first = (Node * )malloc(sizeof(Node));
	r = first;
	for(int i = 0 ; i<n;i++){
		
		s = (Node *)malloc(sizeof(Node));
		s->data = a[i];
		r->next = s;
		r = s;
	}
	r->next = NULL;
	return first;
	
}

//删除操作

int Delete(Node * first,int i,DataType * ptr){
	
	Node *p = first;
	Node *q = NULL;
	int count = 0;
	DataType x;
	
	//查找到 第i-1 个节点
	while(p != NULL && count < i-1){
		count++;
		p = p->next;
		
	}
	
	
	if(p == NULL || p->next == NULL){
		
		printf("位置错误删除失败\n");
		return 0;
	}else{
		
		q = p->next;
		*ptr = q->data;
		p->next = q->next;
		free(q);
		return 1;
		
	}
	
}

//销毁链表

void DestroyList(Node * first){
	
	Node * p = first;
	while(first != NULL)
	{
		first = first->next;
		free(p);
		p = first;
	}
	
}

//单链表的使用
int main(){
	
	int r[5] = {1,2,3,4,5};
	int i,x;
	Node * first = NULL;
	first = CreateList(r,5);
	
	printf("当前单链表的数据为:\n");
	PringtList(first);
	
	printf("执行插入操作\n");
	Insert(first,2,8);
	printf("插入后结果:\n");
	PringtList(first);
	
	printf("当前单链表的长度%d\n",Length(first));
	
	printf("请输入要查找的元素值\n");
	scanf("%d",&x);
	i = Locate(first,x);
	if(i !=  0){
		printf("元素%d的位置为: %d\n",x,i);
	}else{
		
		printf("单链表中没有此元素\n");
	}
	
	printf("请输入删除第几个元素\n");
	scanf("%d",&x);
	if(Delete(first,i,&x) == 1){
		
		printf("删除的数据元素值为%d,删除后数据为:\n",x);
		PringtList(first);
	
	}else{
	
		printf("删除失败\n");
	}
	
	DestroyList(first);
	return 0;
	
}