#include <stdio.h>
#include <stdlib.h>
struct LNode
{
int data;
struct LNode *next;
};
typedef struct LNode* list;
//求链表的长度
int length(list ptr)
{
list p = ptr;
int i = 0;
while (p)
{
p = p->next;
i++;
}
return i;
}
//查找
//按序号查找
list findkth(int k, list ptr)
{
list p = ptr;
int i = 1;
while (p != NULL&&i < k)
{
p = p->next;
i++;
}
if (i == k)
{
return p;
}
else
{
return NULL;
}
}
//按值查找
list find(int x,list ptr)
{
list p = ptr;
while (p->data != x&&p != NULL)
{
p = p->next;
}
return p;
}
//插入 插在第i个位置 也就是在i-1后的位置插入
list insert(int x, int i, list ptr)
{
list p, s;
if (i == 1)//头插入
{
s = (list)malloc(sizeof(LNode));
s->data = x;
s->next = ptr;
return s;
}
p = findkth(i - 1, ptr);//找 先找到第i-1个节点
if (p == NULL)
{
printf("插入位置不存在!\n");
return NULL;
}
else
{
s = (list)malloc(sizeof(LNode));
s->data = x;
s->next = p->next;//先连
p->next = s;//后断
return ptr;//返回新链表的表头
}
}
//删除 删除第i个节点 要找到第i-1个节点
list Delete(int i, list ptr)
{
list p, s;
if (i == 1)//头删除
{
s = ptr;
if (ptr != NULL)
{
ptr = ptr->next;
}
else
{
return NULL;
}
free(s);
return ptr;
}
p = findkth(i - 1, ptr);
{
if (p == NULL)
{
printf("第%d个位置不存在!\n",i-1);
return NULL;
}
else if (p->next == NULL)
{
printf("第%d个位置不存在!\n", i);
return NULL;
}
else
{
s = p->next;
p->next = s->next;//先连
free(s);//后断
return ptr;
}
}
}
int main()
{
system("pause");
return 0;
}
注意点:
1、在进行插入和删除操作时,要对头结点进行特殊处理。
2、插入和删除操作,一定是先找到,才能进行操作。
3、插入和删除操作,一定是先连后断,删除操作时一定要用free(C++用delete)释放空间,否则会造成内存泄漏。