2020-08-18 C语言实现链表

链表

  • LinkList.c
    • LinkList.h
    • LinkListmain.c

LinkList.c

#include "LinkList.h"
#include 
#include 

// 创建
List list_create(){
	List l = {NULL,NULL,0};
	return l;
}
// 初始化
bool list_init(List* seq){
	seq->head = NULL;
	seq->tail = NULL;
	seq->size = 0;
	return true;
}
// 销毁
void list_destroy(List* seq);

// 基本操作
// 添加数据
void list_append(List* seq,LinkType val){
	// 创建新节点
	Node* n = malloc(sizeof(Node));
	n->val = val;
	n->next = NULL;
	if(NULL == seq->head){ // 第一个节点
		seq->head = n;
		seq->tail = n;
	}else{
		// 找到最后一个节点
		/*
		Node* p = seq->head;
		while(NULL != p->next){
			p = p->next;
		}
		p->next = n;
		*/
		seq->tail->next = n;
		seq->tail = n;
	}
	seq->size++;
}
void list_prepend(List* seq,LinkType val){
	// 创建新节点
	Node* n = malloc(sizeof(Node));
	n->val = val;
	n->next = seq->head;
	if(NULL == seq->head){
		seq->tail = n;
	}
	seq->head = n;
	seq->size++;
/*
	n->next = NULL;
	if(NULL == seq->head){ // 第一个节点
		seq->head = n;
	}else{
		n->next = seq->head;
		seq->head = n;
	}
	*/
}
// 插入数据
void list_insert(List* seq,int index,LinkType val){
	// 创建新节点
	Node* n = malloc(sizeof(Node));
	n->val = val;
	n->next = NULL;

	// 在头部插入
	if(NULL == seq->head || 0 == index){
		list_prepend(seq,val);
		return;
	}

	// for(Node* p=seq->head;NULL!=p;p=p->next){}
	// 找到前一个节点
	Node* p = seq->head;
	int count = 0;
	while(NULL!= p){
		if(index-1 == count) break;
		++count;
		p = p->next;
	}

	// 在尾部插入
	if(NULL == p){
		list_append(seq,val);
		return;
	}
	// 中间部插入
	Node* q = p->next;
	p->next = n;
	n->next = q;
	seq->size++;
}
// 删除数据
void list_delete(List* seq,int index){
	// 删除第一个节点
	if(0 == index){
		Node* del = seq->head;
		seq->head = del->next;
		free(del);
		seq->size--;
		if(0==seq->size){// 删除最后一个节点
			seq->head = seq->tail = NULL;
		}
		return;
	}
	// 找到前一个节点
	Node* p = seq->head;
	int count = 0;
	while(NULL!= p){
		if(index-1 == count) break;
		++count;
		p = p->next;
	}

	if(NULL == p){// index不在删除范围
		return;
	}

	// 删除其他节点
	Node* del = p->next;
	if(NULL == del->next){// 删除尾节点
		seq->tail = p;
	}
	p->next = del->next;
	free(del);
	seq->size--;
}
// 获取数据
LinkType list_get(List* seq,int index);
LinkType* list_at(List* seq,int index){
	int count = 0;
	Node* p = seq->head;
	while(NULL!=p){
		if(index == count) return &(p->val);
		++count;
		p = p->next;
	}
	return NULL;
}
// 获取元素个数
int list_size(List* seq){
	/*
	int size = 0;
	Node* p = seq->head;
	while(NULL!=p){
		++size;
		p = p->next;
	}
	*/
	return seq->size;
}

// 打印
void list_print(List* seq){
	Node* p = seq->head;
	while(NULL != p){
		printf("%d ",p->val);
		p = p->next;
	}
	printf("\n");
}
// 遍历
typedef void (*traval_t)(LinkType* val);
void list_traval(List* seq,traval_t func){
	Node* p = seq->head;
	while(NULL != p){
		(*func)(&(p->val));
		p=p->next;
	}
}

// int list_comp_element(const LinkType* a,const LinkType* b)

void list_sort(List* seq);

// 清空
void list_clear(List* seq);
// 判空
bool list_empty(List* seq);
// 查找
int list_find(List* seq,LinkType val);
LinkType* list_search(List* seq,LinkType val); 


LinkList.h

#ifndef _LINKLIST_H
#define _LINKLIST_H
#include

// 顺序表结构体
typedef struct{
char name[20];
bool sex;
int age;
} Student;

typedef int LinkType;

typedef struct _Node{
struct _Node* next; // 指针域
LinkType val; // 数据域
}Node;

typedef struct {
Node* head;// 头指针
Node* tail;// 尾指针
int size;
} List;

// 创建
List list_create();
// 初始化
bool list_init(List* seq);
// 销毁
void list_destroy(List* seq);

// 基本操作
// 添加数据
void list_append(List* seq,LinkType val);
void list_prepend(List* seq,LinkType val);
// 插入数据
void list_insert(List* seq,int index,LinkType val);
// 删除数据
void list_delete(List* seq,int index);
// 获取数据
LinkType list_get(List* seq,int index);
LinkType* list_at(List* seq,int index);
// 获取元素个数
int list_size(List* seq);

// 打印
void list_print(List* seq);
// 遍历
typedef void (traval_t)(LinkType val);
void list_traval(List* seq,traval_t func);

// int list_comp_element(const LinkType* a,const LinkType* b)

void list_sort(List* seq);

// 清空
void list_clear(List* seq);
// 判空
bool list_empty(List* seq);
// 查找
int list_find(List* seq,LinkType val);
LinkType* list_search(List* seq,LinkType val);

#endif // _LINKLIST_H

LinkList2.c

#include "LinkList.h"
#include 
#include 

// 创建
List list_create(){
	Node* dummy = malloc(sizeof(Node));// 头结点
	dummy->next = NULL;
	List l = {dummy,dummy,0};
	return l;
}
// 初始化
bool list_init(List* seq){
	Node* dummy = malloc(sizeof(Node));// 头结点
	dummy->next = NULL;
	seq->head = dummy;
	seq->tail = dummy;
	seq->size = 0;
	return true;
}
// 销毁
void list_destroy(List* seq){
	Node* p = seq->head;
	while(NULL != p){
		Node* del =p;
		p = p->next;
		free(del);
	}
	seq->size = 0;
	seq->head = seq->tail = NULL;
}

// 基本操作
// 添加数据
void list_append(List* seq,LinkType val){
	// 创建新节点
	Node* n = malloc(sizeof(Node));
	n->val = val;
	n->next = NULL;
	seq->tail->next = n;
	seq->tail = n;
	seq->size++;
}
void list_prepend(List* seq,LinkType val){
	// 创建新节点
	Node* n = malloc(sizeof(Node));
	n->val = val;
	n->next = seq->head->next;
	if(seq->tail == seq->head){
		seq->tail = n;
	}
	seq->head->next = n;
	seq->size++;
}
// 插入数据
void list_insert(List* seq,int index,LinkType val){
	// 创建新节点
	Node* n = malloc(sizeof(Node));
	n->val = val;
	n->next = NULL;

	// for(Node* p=seq->head;NULL!=p;p=p->next){}
	// 找到前一个节点
	Node* p = seq->head;
	int count = -1;
	while(NULL!= p){
		if(index-1 == count) break;
		++count;
		p = p->next;
	}

	// 在尾部插入
	if(NULL == p){
		list_append(seq,val);
		return;
	}
	// 中间部插入
	Node* q = p->next;
	p->next = n;
	n->next = q;
	seq->size++;
}
// 删除数据
void list_delete(List* seq,int index){
	// 找到前一个节点
	Node* p = seq->head;
	int count = -1;
	while(NULL!= p){
		if(index-1 == count) break;
		++count;
		p = p->next;
	}

	if(NULL == p){// index不在删除范围
		return;
	}

	// 删除其他节点
	Node* del = p->next;
	if(NULL == del->next){// 删除尾节点
		seq->tail = p;
	}
	p->next = del->next;
	free(del);
	seq->size--;
}
// 获取数据
LinkType list_get(List* seq,int index);
LinkType* list_at(List* seq,int index){
	int count = -1;
	Node* p = seq->head;
	while(NULL!=p){
		if(index == count) return &(p->val);
		++count;
		p = p->next;
	}
	return NULL;
}
// 获取元素个数
int list_size(List* seq){
	/*
	int size = 0;
	Node* p = seq->head;
	while(NULL!=p){
		++size;
		p = p->next;
	}
	*/
	return seq->size;
}

// 打印
void list_print(List* seq){
	Node* p = seq->head->next;
	while(NULL != p){
		printf("%d ",p->val);
		p = p->next;
	}
	printf("\n");
}
// 遍历
typedef void (*traval_t)(LinkType* val);
void list_traval(List* seq,traval_t func){
	Node* p = seq->head->next;
	while(NULL != p){
		(*func)(&(p->val));
		p=p->next;
	}
}

// int list_comp_element(const LinkType* a,const LinkType* b)

void list_sort(List* seq);

// 清空
void list_clear(List* seq);
// 判空
bool list_empty(List* seq);
// 查找
int list_find(List* seq,LinkType val);
LinkType* list_search(List* seq,LinkType val); 

LinkListmain.c

#include 
#include "LinkList.h"

void PrintElement(LinkType* val){
	printf("%d ",*val);
}

int main(){
	List l = list_create();

	list_append(&l,1);
	list_print(&l);

	list_append(&l,2);
	list_print(&l);

	list_append(&l,3);
	list_print(&l);

	list_append(&l,4);
	list_print(&l);

	list_append(&l,5);
	list_print(&l);

	list_prepend(&l,10);
	list_print(&l);
	list_prepend(&l,11);
	list_print(&l);
	list_prepend(&l,12);
	list_print(&l);
	list_prepend(&l,13);
	list_print(&l);

	list_insert(&l,0,0);
	list_print(&l);
	list_insert(&l,100,0);
	list_print(&l);
	list_insert(&l,3,0);
	list_print(&l);

	list_delete(&l,3);
	list_print(&l);
	list_delete(&l,0);
	list_print(&l);
	list_delete(&l,9);
	list_print(&l);
	printf("size=%d\n",list_size(&l));

	LinkType* p = list_at(&l,5);
	*p = 500;
	list_print(&l);
	list_traval(&l,PrintElement);

	list_destroy(&l);
}

你可能感兴趣的:(数据结构和算法,单链表)