版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011123091/article/details/82053504
记录单向链表的插入,打印,删除等操作代码,下边是代码
#include <stdio.h>
#include <stdlib.h>
typedef struct Listnode
{
void * data;//数据域可以是任意类型,比如下文的结构体
struct Listnode * next;
}listnode;
typedef struct
{
listnode * head;
int size;
}linklist;
//初始化完成了,定义链表指针,分配链表空间,分配头节点空间,返回链表指针
linklist * Init_Linklist()
{
linklist * mylinklist=0;
mylinklist=(linklist*)malloc(sizeof(linklist));
listnode * head=0;
head=(listnode *)malloc(sizeof(listnode));
mylinklist->size=0;
head->data=0;//头节点不算节点
head->next=NULL;
mylinklist->head=head;
return mylinklist;
}
//需要找到合适的位置,然后执行插入,传参数的目的是让知道插入哪里,插入的数据
//以及插入那个链表,头结点并不是第一个节点,插入和删除都不和头节点有关系
void insert_link_pos(linklist * mylinklist,int pos,void * data)
{
if(mylinklist==NULL || data==NULL)//第一步做参数检查
return;
if(pos<0 || pos>=mylinklist->size)
{
pos=mylinklist->size;
}
//首先新建一个node
listnode * insertnode=(listnode *)malloc(sizeof(listnode));
insertnode->data=data;
insertnode->next=NULL;
//找到要插入的位置,根据链表头插入的是head
//找到的节点位置是插入的前一个
listnode * currnode=mylinklist->head;
for(int i=0;i<pos;i++)
currnode=currnode->next;
//新节点入表
//插入到所在位置
insertnode->next=currnode->next;
currnode->next=insertnode;
mylinklist->size++;
}
//删除指定位置的节点
void removebypos_linklist(linklist * list,int pos)
{
//先检查参数是否合法
if(list==NULL)
{
return;
}
if(pos<0 || pos>list->size)
{
pos=list->size;
}
//找到位置
listnode * currnode=list->head;
for(int i=0;i<pos;i++)
currnode=currnode->next;
//currnode现在指向当前位置的指针,是要删除的前一个
listnode * dellink=currnode->next;
currnode->next=dellink->next;
free(dellink);//别忘了释放节点
list->size--;
}
int findlinklist(linklist *list,void * data)
{
int i=0;
if(list == NULL) return -1;
listnode * currnode=list->head->next;
while(currnode!=NULL)
{
if(currnode->data==data)
{
break;
}
i++;
currnode=currnode->next;
}
return i;
}
//获得链表的长度
int Size_LinkList(linklist* list){
return list->size;
}
//获得第一个节点
void * returnFirstNode(linklist * list)
{
return list->head->next->data;
}
//定义函数指针
typedef void * (*MYPRIINT)(void *);
void printListnode(linklist * list,MYPRIINT print)
{
//先检查参数
if(list==NULL) return;
//先找到第一个节点
listnode * currnode=list->head->next;
while(currnode!=NULL)
{
print(currnode->data);
currnode=currnode->next;
}
}
void freeLinklist(linklist *list)
{
if(list==NULL) return;
listnode * currnode=list->head;
//释放每一个node
while(currnode!=NULL)
{
listnode * pnext=currnode->next;
free(currnode);
currnode=pnext;
}
list->size=0;
//释放list
free(list);
}
//实验
typedef struct
{
char name[40];
int age;
int score;
}Person;
void *myprint(void *data)
{
Person * p=(Person*)data;
printf("Name:%s Age:%d Score:%d\n",p->name,p->age,p->score);
return NULL;
}
int main()
{
linklist * list=Init_Linklist();
Person p1={"aaa",12,700};
Person p2={"bbb",13,700};
Person p3={"ccc",16,700};
insert_link_pos(list ,0,&p1);
insert_link_pos(list ,0,&p2);
insert_link_pos(list ,0,&p3);
printListnode(list,myprint);
removebypos_linklist(list,1);
printf("===================\n");
printListnode(list,myprint);
printf("\npos is %d\n",findlinklist(list,(void *)&p1));
return 0;
}
实验现象:我ide用的是菜鸟在线工具。记录下来方便自己学习