参考资料为浙江大学-数据结构课程以及《大话数据结构》书籍
typedef int ElementType;
typedef struct LNode* List;
struct LNode {
ElementType Data;//数据
List Next;//下一个结点
};
1、初始化
List MakeEmpty() {
List PtrL;
PtrL = (List)malloc(sizeof(struct LNode));
if (!PtrL)
exit(-1);
PtrL->Next = NULL;
return PtrL;
}
2、求表长
int Length(List PtrL) {
List p = PtrL;
int j = 0;
while (p) {
p = p->Next;
j++;
}
return j - 1;
}
3、查找
3-1、按序号查找
ElementType FindKth(int K, List PtrL) {//寻找第K个位置的元素
List p = PtrL;
int i = 0;
while (p != NULL && i < K) {
p = p->Next;
i++;
}
if (i == K) {
return p->Data;
}
else {
return NULL;
}
}
3-2、按值查找
int Find(ElementType X, List PtrL) {
List p = PtrL;
int j = 0;
while (p != NULL && p->Data != X) {
p = p->Next;
++j;
}
return j;
}
4、插入
List Insert(ElementType X, int i, List PtrL) {
int j;
List p, s;
p = PtrL;
j = 1;
while (p && j < i) {
p = p->Next;
++j;
}
if (!p || j > i) {
return NULL;
}
s = (List)malloc(sizeof(struct LNode));
s->Data = X;
s->Next = p->Next;
p->Next = s;
return PtrL;
}
5、删除
List Delete(int i, List PtrL) {
int j;
List p, q;
p = PtrL;
j = 1;
while (p->Next && j < i) {
p = p->Next;
++j;
}
if (!(p->Next) || j > i) {
return NULL;
}
q = p->Next;
p->Next = q->Next;
free(q);
return PtrL;
}
6、遍历链表并输出
void DisLinkList(List PtrL)
{
List p = PtrL->Next;
printf("输出链表: ");
while (p)
{
printf("%d ", p->Data);
p = p->Next;
}
return;
}
7、完整+测试程序
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct LNode* List;
struct LNode {
ElementType Data;//数据
List Next;//下一个结点
};
//初始化
List MakeEmpty() {
List PtrL;
PtrL = (List)malloc(sizeof(struct LNode));
if (!PtrL)
exit(-1);
PtrL->Next = NULL;
return PtrL;
}
//求表长
int Length(List PtrL) {
List p = PtrL;
int j = 0;
while (p) {
p = p->Next;
++j;
}
return j - 1;
}
//查找
//按序号查找
ElementType FindKth(int K, List PtrL) {//寻找第K个位置的元素
List p = PtrL;
int i = 0;
while (p != NULL && i < K) {
p = p->Next;
i++;
}
if (i == K) {
return p->Data;
}
else {
return NULL;
}
}
//按值查找 PtrL->结点1->结点2->结点3->结点4->结点5
int Find(ElementType X, List PtrL) {
List p = PtrL;
int j = 0;
while (p != NULL && p->Data != X) {
p = p->Next;
++j;
}
return j;
}
//插入
List Insert(ElementType X, int i, List PtrL) {
int j;
List p, s;
p = PtrL;
j = 1;
while (p && j < i) {
p = p->Next;
++j;
}
if (!p || j > i) {
return NULL;
}
s = (List)malloc(sizeof(struct LNode));
s->Data = X;
s->Next = p->Next;
p->Next = s;
return PtrL;
}
//删除
List Delete(int i, List PtrL) {
int j;
List p, q;
p = PtrL;
j = 1;
while (p->Next && j < i) {
p = p->Next;
++j;
}
if (!(p->Next) || j > i) {
return NULL;
}
q = p->Next;
p->Next = q->Next;
free(q);
return PtrL;
}
//遍历链表并输出
void DisLinkList(List PtrL)
{
List p = PtrL->Next;
printf("输出链表: ");
while (p)
{
printf("%d ", p->Data);
p = p->Next;
}
return;
}
int main(void) {
List L;
L = MakeEmpty();
int n, x, dn, sn, snv;
printf("请输入n:\n");
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
printf("请输入整数数据:\n");
scanf("%d", &x);
Insert(x, i, L);
}
DisLinkList(L);
printf("\n");
int len = Length(L);
printf("表长为:%d\n",len);
printf("请输入要查找元素的位置序号:\n");
scanf("%d", &sn);
int va = FindKth(sn, L);
printf("第%d个位置的元素值为%d\n", sn, va);
printf("请输入要查找元素:\n");
scanf("%d", &snv);
int nu = Find(snv, L);
printf("%d的位置序号为%d\n", snv, nu);
printf("请输入想要删除的元素的位置序号:\n");
scanf("%d", &dn);
Delete(dn, L);
DisLinkList(L);
printf("\n");
return 0;
}
8、结果