定义单链表
//定义单链表
typedef struct linkListS {
//单链表元素数组
int data;
//指针域,指向后继节点
struct linkListS* next;
}linkListS;
建立单链表(带头节点)
头插法:
//建立单链表(带头节点)
void CreateLinkList(linkListS*& L, int a[], int n) {
linkListS* s;
int i = 0;
//头插法
//开辟空间
L = (linkListS*)malloc(sizeof(linkListS));
L->next = NULL;
for (i = 0; i < n; i++) {
s = (linkListS*)malloc(sizeof(linkListS));
s->data = a[i];
s->next = L->next;
L->next = s;
}
}
尾插法:
void CreateLinkList(linkListS*& L, int a[], int n) {
//尾插法
linkListS* s,*r;
int i = 0;
L = (linkListS*)malloc(sizeof(linkListS));
r = L;
for (i = 0; i < n; i++) {
s = (linkListS*)malloc(sizeof(linkListS));
s->data = a[i];
r->next = s;
r = s;
}
r->next = NULL;
}
打印单链表中的元素
//打印单链表中的元素
void PrintLinkList(linkListS* L) {
linkListS* p=L->next;
while (p != NULL) {
printf("%d\n", p->data);
p = p->next;
}
}
销毁单链表
void DestroyLinkList(linkListS*& L) {
linkListS* p=L->next,*pre=L;
while (p!=NULL)
{
free(pre);
pre = p;
p = pre->next;
}
free(pre);
}
单链表长度
//单链表长度
int LinkListLen(linkListS* L) {
linkListS* p = L->next;
int len = 0;
while (p!=NULL)
{
len++;
p = p->next;
}
return len;
}
查找第i位元素,返回该元素的值
//查找第i位元素,返回该元素的值
int GetLinkElem(linkListS* L, int i) {
int k = 0;
linkListS* p = L;
if (i <= 0) {
return -1;
}
while (k<i&&p!=NULL)
{
k++;
p = p->next;
}
if (p == NULL) {
return -1;
}
else {
//此时p指向的元素,就是要找的第i位元素
return p->data;
}
}
查找值为x,返回该元素的逻辑序号
int GetLinkNum(linkListS* L, int x) {
int k = 1;
linkListS* p = L->next;
while (p->data!=x&&p!=NULL)
{
k++;
p = p->next;
}
if (p == NULL) {
return -1;
}
else {
return k;
}
}
在第i位插入元素x
void InsertLinkElem(linkListS*& L, int i, int x) {
int k = 0;
linkListS* p = L,*s;
if (i <= 0) { return; }
while (k<i-1&&p!=NULL)
{
k++;
p = p->next;
}//找到第i-1位(i的前面那位)
if (p == NULL) {
return;
}
else {
//为x分配空间
s = (linkListS*)malloc(sizeof(linkListS));
s->data = x;
s->next = p->next;
p->next = s;
}
}
删除第i位元素
void DeleteLinkElem(linkListS*& L, int i) {
int k = 0;
linkListS* p = L;
if (i <= 0) { return; }
while (k<i-1&&p!=NULL)
{
k++;
p = p->next;
}
if (p == NULL) {
return;
}
else {
//找到第i位前面的节点
p->next = p->next->next;
//释放该节点
free(p->next);
}
}