单链表
单链表物理不一定相邻,单链表通过保存下一个结点的地址来访问下一个结点
typedef struct Node
{
int data;//存放数据
struct Node *next;//存放下一个节点的地址
}Node,*List;//List == Node *
//头插
void Insert_head(CList plist,int val)
{
CNode *p = (CNode*)malloc(sizeof(CNode));
p->data = val;
p->next = plist->next;
plist->next = p;
}
//尾插
bool Insert_tail(List plist,int val)//O(n)
{
Node *p = (Node *)malloc(sizeof(Node));
p->data = val;
Node *q;
for(q=plist;q->next!=NULL;q=q->next) ;//找尾巴
//将p插入在q后面
p->next = q->next;//p->next = NULL;
q->next = p;
return true;
}
//查找
Node *Srearch(List plist,int key)
{
for(Node *p=plist->next;p!=NULL;p=p->next)
{
if(p->data == key)
{
return p;
}
}
return NULL;
}
//删除
bool Delete(List plist,int key)
{
Node *p;
for(p=plist;p->next!=NULL;p=p->next)
{
if(p->next->data == key)
{
Node *q = p->next;//记录需要删除的节点
p->next = q->next;
free(q);
return true;
}
}
return false;
}
注意我们这里创建的结点如果要删除是需要释放内存的,不然会发生内存泄露
//逆置
void Reverse(List plist)
if(plist==NULL || plist->next==NULL || plist->next->next==NULL)
{
return ;
}
//下面的时间复杂度为O(n),并且最好,利用头插的思想
Node *p = plist->next;
Node *q;
plist->next = NULL;//
while(p != NULL)
{
q = p->next;
p->next = plist->next;//将节点p头插到链表中
plist->next = p;
p = q;
}
}