关键算法和数据结构
单链表
- 线性表:逻辑上相邻,物理上也相邻。
- 单链表:
数据域+指针域
如要操作链表,需要声明额外的指针。
单链表的创建算法
定义一个链表结点
typedef struct node
{
int num;
struct node *next;
}stud;
算法如下:
#include <malloc.h>
typedef struct node
{
int num; //数据域
struct node *next; //指针域
}stud;
stud * create(int n) //创建n个结点
{
stud *head,*p1,*p2; //p1指向新结点,p2指向当前结点
head=p1=p2=NULL;
for(int =0;i<n;i++)
{
p1=(stud *)malloc(sizeof(stud)); //创建新结点
p1->num=i;
if(i==0)
head=p1;
else
{
p2->next=p1;
}
p2=p1;
}
p2->next=NULL; //最后一个节点指向NULL
return head;
}
单链表的查找算法
外部传入一个head指针
typedef struct node
{
int num;
struct node *next;
}stud;
stud * find(stud *head,int i)
{
stud *p1; //遍历的指针
p1=head;
while(p1!=NULL) //链表非空
{
if(i==p1->num)
break;
else
{
p1=p1->next;
if(p1==NULL)
{
printf("cannot find!\n");
return NULL;
}
}
}
return p1;
}
单链表的删除算法
与查找思路差不多,但要注意head结点和找不到删除节点的情况
bool del(stud *head,int i) //删除成功返回true,失败或未找到返回false
{
bool bret=false;
if(head)
{
stud *p1,*p2;
p1=head;
while(p1->num!=i&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(p1)
{
if(p1==head) //head结点情况处理方式不同
head=p1->next;
else
p2->next=p1->next;
bret=ture;
free(p1);
}
}
return bret;
}
单链表的插入算法
前提链表有序
stud *insert(stud *head ,stud *p)
{
stud *p1,*p2;
p1=head;
if(!head)
{
head=p;
head->next=NULL;
}
else
{
while(p->num > p1->num && p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(p1==head) //注意点
{
head=p;
p->next=p1;
}
else
{
p2->next=p;
p->next=p1;
}
}
}
待续。。。