链表 (插入,遍历,删除)多种方法代码详解:

数据的分类:
 1、物理结构:数据所在内存的表现(顺序结构、链式结构
    顺序结构:数据之间紧挨在一起
    链式结构:不挨在一起
 2、逻辑结构:数据之间的联系(散列,线性,树形,图形)
    散列:节点之间毫无联系
    线性:节点之间存在1:1的联系(每一个节点只有一个直接前驱和一个直接后驱)
        通过物理区来表现线表: 1、顺序线性表 2、链式线性表
    树形结构:节点之间存在1:N的联系(且每一个节互不相连)
    图形结构:节眯之间存在N:N的联系

链表操作功能:
 1、插入节点:(头插法,尾插法:新的结点成为头节点/尾节点)
       (1)、为节点分配空间
       (2)、修改节点的联系
       尾插法:新的节点成为尾节点
       头插法:新的节点成为头节点
 2、删除节点:
 3、修改节点:
 4、查找节点:
 5、遍历节点:

链表尾插法(插入、遍历、删除)代码如下:(新的节点成为尾节点)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct nd;
struct student;

typedef  struct nd node;
typedef  struct nd* pnode;
typedef  struct student dtype;
typedef  char BOOL;
#define  TRUE 1
#define  FALSE 0

struct student
{
	int id;
	char name[10];
	char tel[12];
};
//定义节点
struct nd
{
	pnode next;
	dtype data;
	
};

//插入节点
BOOL insert(struct student d,pnode* ph)
{
	pnode pnew=malloc(sizeof(pnode));
	if(NULL==pnew)
		return FALSE;
	pnew->data=d;
	pnew->next=NULL;
	if(*ph==NULL)
	{
		*ph=pnew;	
	}
	else
	{
		pnode prear=*ph;
		while(NULL!=(prear->next)) prear=prear->next;
		prear->next=pnew;
	}
	return TRUE;
}
//遍历
void list(pnode ploc)
{
	while(ploc!=NULL)
	{	
		printf("%s %d %s\n",ploc->data.name,ploc->data.id,ploc->data.tel);
		ploc=ploc->next;
	}
}
//查找
BOOL find (pnode p,int id)
{
	while(p!=NULL)
	{
		if(p->data.id==id)	
			printf("%s %d %s\n",p->data.name,p->data.id,p->data.tel);
		p=p->next;
	}
	
}
//修改
BOOL alter(int id,pnode p,char tel[])
{
	while(p!=NULL)
	{
		if(p->data.id==id)	
		{
			strcpy(p->data.tel,tel);
			printf("%s %d %s\n",p->data.name,p->data.id,p->data.tel);
			
		}
		p=p->next;
	}

}
//删除
BOOL delete(int id,pnode p)
{
	
}
void main()
{
	pnode phead=NULL;
	struct student s={1001,"cs","21345"};
	insert(s,&phead);
	list(phead);
	find(phead,1001);
	alter(1001,phead,"0987");
}

链表头插法(插入、遍历、删除)代码如下:(新的节点成为头节点)

代码中删除有两种方法

#include<stdio.h>
#include<stdlib.h>
#include"link.h"
#include<stdbool.h>
struct nd;

typedef int dtype;
typedef struct nd node;
typedef struct nd* pnode;

struct nd
{
	dtype data;
	struct nd* next;

};

//头插
bool insert(dtype s,pnode* ppa)
{
	node* pnew=malloc(sizeof(node));
	if(pnew==NULL)
		return false;
	pnew->data=s;
	pnew->next=*ppa;
	*ppa=pnew;
}
/*
//删除节点(方法一)
bool delete(pnode* ph,dtype d)
{
	if(NULL==*ph)
		return false;
	else
	{
		pnode finder=*ph;
		if(finder->data==d)
		{
			*ph=finder->next;
			free(finder);
			return true;
		}
		while((finder->next)!=NULL&&(finder->next)->data!=d)finder=finder->next;
		if(finder==NULL)
			return false;
		else
		{
			pnode dn=finder->next;
			finder->next=finder->next->next;
			free(dn);	
		}
	}
}*/
//删除(方法二)
bool delete(pnode* ph,dtype d)
{
	pnode front=*ph,rear=*ph;
	while(rear!=NULL&&rear->data!=d)
	{
		front=rear;
		rear=rear->next;
	}
	if(*ph==NULL)
		return false;
	else
		if(rear==*ph)
			*ph=NULL;
		else
			front->next=rear->next;
		free(rear);
	return true;
}
//遍历
bool list(pnode p)
{
	while(p!=NULL)
	{
		printf("%d\n",p->data);
		p=p->next;
	}
}

void main()
{
	pnode phead=NULL;
	dtype d=100;
	insert(d,&phead);
	insert(200,&phead);
	insert(300,&phead);
	
	delete(&phead,100);
	list(phead);
}

猜你喜欢

转载自blog.csdn.net/weixin_42581477/article/details/81366672
今日推荐