link2.h
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
struct Node{
void *data;
struct Node *next;
};
struct pointer{
int size;
struct Node pHeader;
};
typedef void * link;
// 创建单链表
link create_link();
// 添加节点
void insert_node(link list,int pos,void *value);
// 输出链表
void print_link(link list,void(*print)(void *));
// 在末尾添加节点
void link_push(link list,void *value);
// 删除尾结点
void * link_pop(link list);
// 在添加首节点
void link_unshift(link list,void *value);
// 删除首节点
void * link_shift(link list);
// 获取指定位置节点
void * link_index(link list,int pos);
// 删除指定位置节点
void * link_splice(link list,int pos);
// 翻转链表
void link_reverse(link list);
// 清空链表
void link_clear(link list);
// 删除链表
void link_destory(link list);
// 获取链表长度
int link_length(link list);
link2.c
#include "link2.h"
link create_link(){
struct pointer *pNode=(struct pointer *)malloc(sizeof(struct pointer));
if(!pNode)
return NULL;
pNode->size=0;
pNode->pHeader.data=NULL;
pNode->pHeader.next=NULL;
return (link)pNode;
}
void insert_node(link list,int pos,void *value){
if(!list||!value)
return ;
struct pointer *pNode=(struct pointer *)list;
if(pos>pNode->size||pos<0)
pos=pNode->size;
struct Node *pCur=&pNode->pHeader;
for(int i=0;i<pos;i++){
pCur=pCur->next;
}
struct Node *newNode=(struct Node*)malloc(sizeof(struct Node));
newNode->data=value;
newNode->next=pCur->next;
pCur->next=newNode;
pNode->size++;
}
void print_link(link list,void(*print)(void *)){
if(!list||!print)
return ;
struct pointer *pNode=(struct pointer *)list;
struct Node *pCur=&pNode->pHeader;
pCur=pCur->next;
for(int i=0;i<pNode->size;++i){
print(pCur->data);
pCur=pCur->next;
}
}
void link_push(link list,void *value){
if(!list||!value)
return ;
struct pointer *pNode=(struct pointer *)list;
struct Node *pCur=&pNode->pHeader;
for(int i=0;i<pNode->size;i++){
pCur=pCur->next;
}
struct Node *newNode=(struct Node *)malloc(sizeof(struct Node));
newNode->data=value;
newNode->next=pCur->next;
pCur->next=newNode;
pNode->size++;
}
void * link_pop(link list){
if(!list)
return NULL;
struct pointer *pNode=(struct pointer *)list;
struct Node *pCur=&pNode->pHeader;
for(int i=0;i<pNode->size-1;i++){
pCur=pCur->next;
}
void *del=pCur->next->data;
struct Node *deleteNode=pCur->next;
pCur->next=deleteNode->next;
free(deleteNode);
deleteNode=NULL;
pNode->size--;
return del;
}
void link_unshift(link list,void *value){
if(!list||!value)
return ;
struct pointer *pNode=(struct pointer *)list;
struct Node *pCur=&pNode->pHeader;
struct Node *newNode=(struct Node *)malloc(sizeof(struct Node));
newNode->data=value;
newNode->next=pCur->next;
pCur->next=newNode;
pNode->size++;
}
void * link_shift(link list){
if(!list)
return NULL;
struct pointer *pNode=(struct pointer *)list;
struct Node *pCur=&pNode->pHeader;
void *data=pCur->next->data;
struct Node *deleteNode=pCur->next;
pCur->next=deleteNode->next;
free(deleteNode);
deleteNode=NULL;
pNode->size--;
return data;
}
void * link_index(link list,int pos){
if(!list)
return NULL;
struct pointer *pNode=(struct pointer *)list;
if(pos<0||pos>pNode->size){
return NULL;
}
struct Node *pCur=&pNode->pHeader;
pCur=pCur->next;
for(int i=0;i<pos;i++){
pCur=pCur->next;
}
return pCur->data;
}
void * link_splice(link list,int pos){
if(!list)
return NULL;
struct pointer *pNode=(struct pointer *)list;
if(pos<0||pos>pNode->size)
return NULL;
struct Node *pCur=&pNode->pHeader;
for(int i=0;i<pos-1;++i){
pCur=pCur->next;
}
struct Node *deleteNode=pCur->next;
void *data=deleteNode->data;
pCur->next=deleteNode->next;
free(deleteNode);
deleteNode=NULL;
pNode->size--;
return data;
}
void link_clear(link list){
if(!list)
return ;
struct pointer *pNode=(struct pointer *)list;
if(pNode->size==0)
return ;
struct Node *pCur=&pNode->pHeader;
pCur=pCur->next;
for(int i=0;i<pNode->size;++i){
struct Node *t=pCur->next;
free(pCur);
pCur=t;
}
pNode->size=0;
}
void link_destory(link list){
if(!list)
return ;
link_clear(list);
struct pointer *pNode=(struct pointer *)list;
free(pNode);
pNode=NULL;
list=NULL;
}
int link_length(link list){
if(!list)
return 0;
struct pointer *pNode=(struct pointer *)list;
return pNode->size;
}
void link_reverse(link list){
if(!list)
return ;
struct pointer *pNode=(struct pointer *)list;
if(pNode->size<=1)
return;
struct Node *pHead=&pNode->pHeader;
struct Node *pFont=NULL;
struct Node *pNext=NULL;
while(pHead->next!=NULL){
pFont=pHead->next;
pHead->next=pFont->next;
pFont->next=pNext;
pNext=pFont;
}
pNode->pHeader.next=pFont;
}
struct person {
int id;
char name[30];
int age;
};
void myPrint(void *data){
struct person *p=(struct person *)data;
printf("id:%d name:%s age:%d\n",p->id,p->name,p->age);
}
void test(){
struct person p1={1,"Andy",21};
struct person p2={2,"Andy",21};
struct person p3={3,"Andy",21};
struct person p4={4,"Andy",21};
struct person p5={5,"Andy",21};
struct person p6={6,"Andy",21};
struct person p7={7,"Andy",21};
link l2=create_link();
insert_node(l2,0,&p1);
insert_node(l2,0,&p2);
insert_node(l2,0,&p3);
insert_node(l2,0,&p4);
link_push(l2,&p5);
struct person *p=(struct person *)link_pop(l2);
printf("id:%d name:%s age:%d\n",p->id,p->name,p->age);
link_unshift(l2,&p6);
link_shift(l2);
link_pop(l2);
p=(struct person *)link_index(l2,0);
printf("id:%d name:%s age:%d\n",p->id,p->name,p->age);
p=(struct person *)link_splice(l2,1);
printf("id:%d name:%s age:%d\n",p->id,p->name,p->age);
link_destory(l2);
l2=create_link();
insert_node(l2,0,&p1);
insert_node(l2,0,&p2);
insert_node(l2,0,&p3);
insert_node(l2,0,&p4);
link_reverse(l2);
printf("length : %d\n",link_length(l2));
print_link(l2,myPrint);
}
int main(){
test();
system("pause");
return EXIT_SUCCESS;
}
执行结果
id:5 name:Andy age:21
id:4 name:Andy age:21
id:4 name:Andy age:21
length : 4
id:1 name:Andy age:21
id:2 name:Andy age:21
id:3 name:Andy age:21
id:4 name:Andy age:21
请按任意键继续. . .