#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);
#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);
#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);
}