C数据结构之线性表 3
线性表的元素插入与删除
·
链表的元素插入
1.链表中间的元素s插入(与带头结点链表第一元素插入相同)
s->next = p->next;
p->next = s;
2.(不带头结点)链表第一元素插入
p->next = head->next;
head = p;
链表的元素删除
1.删除链表的第一个元素无头节点
head = head->next;
free(p);
2.删除链表中间的元素
q = p->next;
p->next = q->next;
free(q);
双链链表的插入
链表中插入s
q = p->next;
s->next = q;
q->prior = s;
p->next = s;
s->prior = p;
双链链表的删除
链表中删除s
s->prior->next = s->next;
s->next->prior = s->prior;
free(s);
顺序表的插入
原则:
可插入下标位置p的取值范围:0到length
当表长length等于数组长度maxsize时,不可以在插入元素
移动元素从后往前进行
int sqlist[maxsize] = {1,2,...,n};
int length = n;
//参数列表为数组相当于传入了地址
int insertElem(int sqlist[], int *length, int p, int e)
{
if(p<0 || p>*length || *length==maxsize)
return 0;
for(int i = *length-1; i>=p; i--)
{
sqlist[i+1]=sqlist[i];
}
sqlist[p] = e;
++(*length);
return 1;
}
顺序表删除
原则:
可删除元素下标p的取值:0到length-1
当表长length为0时,不可再删除元素
移动元素从前往后
int deleteElem(int sqlist[], int *length, int p, int *e)
{
if(p<0 || p>length-1)
return 0;
*e = sqlist[p]
for(int i = p; i<*length-1; i++)
{
sqlist[i]=sqlist[i+1];
}
--(*length);
return 1;
}
学习小记
1.带头结点的单链表,删除单链表的最后一个结点的时间复杂度为O(n)
删除最后一个结点,需要遍历链表,找到最后一个结点的前驱,将它的next设置为NULL
2.从一定的顺序表L中删除下标i-j的所有元素
int del(int arr[], int *length, int i, int j)
{
int k, delta;
delta = j-i+1;
for(k=j+1; k < *length;++k)
{
arr[k-delta]=arr[k];
}
length -= delta;
}
3.递增链表删除相同元素
void del(LNode *L)
{
LNode *p = L->next,*p;
while(p->next != NULL)
{
if(p->data == p->next->data)
{
q=p->next;
p->next=q->next;
free(q);
}
else
p=p->next;
}
}
4.将一个链表的数据域中的奇数结点保留,偶数结点提取到另一个链表
void split(LNode *A, LNode *B)
{
LNode *p,*q,*r;
B = (LNode *)malloc(sizeof(LNode));
B->next = NULL;
r = B;
p = A;
while(p->next != NULL){
if(p->next->data%2 == 0)
{
q = p->next;
p->next = q->next;
q->next = NULL:
r->next = q;
r=q;
}
else
p = p->next;
}
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)