C语言 数据结构 单链表

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
请按任意键继续. . .

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值