//建立空的顺序表
List MakeEmpty()
{
List ptrl;
ptrl = (List)malloc(sizeof(struct Lnode));
ptrl.last = -1;
return ptrl;
}
//查找,最少1次找到,最多n次,查找成功的平均比较次数为(n+1)/2,平均时间性能为o(n)
int find(elementtype x, List ptrl)
{
int i = 0;
while (i <= ptrl.last && ptrl.Data[i] != x)
i++;
if (i > ptrl->Last) return -1;//没找到,返回-1
else return i;//找到了,返回存储位置
}
//插入,在第i(i>1,i<n+1)个位置上插入一个值为x的新元素
void insert(elementtype x, int i, List ptrl)
{
int j;
if (prtl->Last == maxsize - 1) {
//表空间已满,不能插入
printf("表满");
return;
}
if (i<1 || i>ptrl->Last + 2) {
//检查插入位置的合理性
printf("位置不合法");
return;
}
for (j = ptrl->Last; j >= i - 1; j--)//平均移动次数n/2.平均时间性能o(n)
ptrl->Data[j + 1] = ptrl.Data[j];//将a1-an倒序向后移动
ptrl->Data[i - 1] = x;//新元素插入
ptrl->Last++;//last仍然指向最后元素
return;
}
//删除 删除表中的第i,i>1,i<n位置上的元素
void deletee(elementtype x, int i, List ptrl)
{
int j;
if (i<1 || i>ptrl->Last + 1) {
//检查删除位置的合理性
printf("不存在第%d个元素",i);
return;
}
for (j = i; j <= ptrl->Last; j++)//平均移动次数n-1/2.平均时间性能o(n)
ptrl->Data[j - 1] = ptrl.Data[j];//将ai+1-an顺序向前移动
ptrl->Last--;//last仍然指向最后元素
return;
}
int Length(List ptrl)//时间o(n),,,求长度
{
List p = ptrl;//p指向表的第一个结点
int j = 0;
while (p) {
p = p->Next;
j++;//当前p指向的是第j个结点
}return j;
}
//查找
//1、按序号查找
List Findkth(int k, List ptrl)
{
List p = ptrl;
int i = 1;
while (p != NULL && i < k) {
p = p->Next;
i++
}
if (i == k)return p;//找到第k个,返回指针
else return NULL;//否则返回空
}
//2按值查找,平均时间性能为o(n)
List Find(Elementtype x, List ptrl) {
List p = ptrl;
while (p != NULL && p->Date != x)
p = p->Next;
return p;
}
//插入,在第i-1,(i>1,i<n+1)个结点后插入一个值为x的新节点
//1、先构造一个新节点,用s指向
//2、再找到链表的第i-1个结点,用p指向;
//3、修改指针,插入节点(p之后插入新结点s)
List Insert(Elementtype x, int i, List Ptrl)//平均查找次数n/2
{
List p, s;
if (i == 1) {//新节点插入在表头
s = (List)malloc(sizeof(struct LNode));//申请填装结点
s->Data = x;//????????
s->Next = prtl;//???????
return s;
}
p = Findkth(i - 1, ptrl);//查找第i-1个结点
if(p == NULL){//第i-1个不存在,不能插入
printf("参数i错");
return NULL;
}
else {
s = (List)malloc(sizeof(struct LNode));
s->Data = x;
s->Next = p->Next;//新节点插入在第i-个节点的后面
p->Next = s;
return ptrl;
}
//删除,删除链表的第i个位置上的节点
//1、先找到链表的第i-个结点,用P指向;
//用指针s指向被删除的结点(p的下一个节点);
//然后修改指针,删除s所指结点
//释放s所指节点的空间free
//平均时间复杂度n/2
List Delete(int i, List ptrl)
{
List p, s;
if (i == 1) {//若要删除的是表的第一个结点
s = ptrl;//s指向第一个节点
if (ptrl != NULL)ptrl = ptrl->Next;//从链表中删除
else return NULL;
free(s);//释放被删除节点
return ptrl;
}
p = Findkth(i - 1, ptrl);//查找第i-个结点
if (p == NULL) {
printf("第%d个节点不存在",i - 1);
return NULL;
}
else if (p->Next == NULL) {
printf("第%d个节点不存在",i);
return NULL;
}
else {
s = p->Next;//s指向第i个结点
p->Next = s->Next;//从链表中删除
free(s);//释放
return ptrl;
}
}
}
链表入门基础知识
最新推荐文章于 2024-10-04 18:59:43 发布