数据的分类:
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);
}