//链表
//解引用不是指向有效空间的指针段错误
//定义的不是链表的结构体,而是链表中一个结点的结构体
typedef struct ListNode
{
int value;
struct ListNode *next;
} Node;
typedef struct SList
{
Node*first; //或者用Node*head来表示
}SList;
//初始化
void SListInit(SList *s)
{
assert(s != NULL);
s->first= NULL;
}
void Test()
{
SList list;
SListInit(&list);
}
//插入,头插
void SListPushFront(SList *s, int v)
{
Node *node =(Node *)malloc(sizeof(Node));
node->value = v;
node->next = s->first;
s->first= node;
}
//头删
void toushan(SList *s)
{
Node *p = s->first->next;
free(s->first);
s->first=p;
}
//尾插
void SListPushBash(SList *s,int v)
{
Node *node =(Node *)malloc(sizeof(Node));
node->value = v;
node->next = NULL;
if (s->first== NULL)
{
s->first= node;
return;
}
Node *cur = s->first;
while
(cur->next!=NULL)
{
cur =cur->next;
}//只要cur->next为空那么一定是最后一个结点
cur->next =node;
}
//尾删
void PopBack2(SList *s, int v)
{
if (s->first->next== NULL)
{
free(s->first);
s->first= NULL;
}
else
{
Node *p = s->first;
while(p->next->next != NULL)
p =p->next;
free(p->next);
p->next = NULL;
}
}
//查找
Node *SListFind(SList *s, int v)
{
Node *p;
for (p = s->first;p != NULL; p = p->next)
{
if(p->value = v)
{
return p;
}
}
return NULL;
}
//在指定位置后面做插入
void SListInsertAfter(SList *s, Node *pos, int v)
{
Node *node =(Node *)malloc(sizeof(Node));
node->value = v;
node->next = pos->next;
pos->next= node;
}
//指定位置做删除
void SListEraseAfter(SList *s, Node *pos)
{
Node *next =pos->next;
pos->next= pos->next->next;
free(next);
}
//链表的销毁
void SListDestroy(SList *s)
{
Node *node;//先定义一个指针用来保存下一个结点
for (Node *cur = s->first;cur != NULL; cur = node)
{
node =cur->next;
free(cur);
}
s->first= NULL;
}
//删除指定数据
void SListRemove(SList *s, int v)
{
if (s->first= NULL)
{
return;
}//链表为空
if (s->first->value== v)
{
Node *next =s->first->next;
free(s->first);
s->first= next;
return;
}//v是第一个first的v时候
Node *node =s->first;
/*for(node; node!=NULL; node = node->next)
{
if(node->value = v)
{
Node *p =node->next;
node->next =node->next->next;
free(p);
return;
}
}
}*/
while(node->next != NULL)
{
if(node->next->value == v)
{
Node *cur =node->next->next;//定义一个结点,让这个结点记录node的下一个的下一个的位置
free(node->next);
cur->next= cur;
return;
}
node =node->next;
}
}
//移除链表中的所有v结点
Node *removeElements(Node *first, int v)
{
if (first== NULL)
return;
Node *node =first;
while(node->next != NULL)
{
if(node->next->value == v)
{
Node *cur =node->next->next;//定义一个结点,让这个结点记录node的下一个的下一个的位置
free(node->next);
cur->next= cur;
return;
}
else
{
node =node->next;
}
}
if (first->value== v)
{
Node*newfirst = first->next;
free(first);
returnnewfirst;
}
}
04-23
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交