数据结构之单向链表代码。

版权声明:本文为博主原创文章,未经博主允许不得转载。 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用的是菜鸟在线工具。记录下来方便自己学习

猜你喜欢

转载自blog.csdn.net/u011123091/article/details/82053504