线性表的链式表示(单链表)
表的数据结构
typedef struct LNode{
int data;
struct LNode *nextNode;
}LNode, *LinkList;
表的初始化
void InitList(LinkList& L) {
L = (LinkList)malloc(sizeof(LinkList));
L->nextNode = NULL;
L->data = NULL;
}
按序号查找
LNode *GetElem(LinkList L, int i) {
LNode *p = L->nextNode;
while (p&&i > 0) {
p = p->nextNode;
i--;
}
return p;
}
按值查找
LNode *LocateElem(LinkList L, int e) {
LNode* p = L->nextNode;
while (p && p->data != e) {
p = p->nextNode;
}
return p;
}
插入操作
void ListInsert(LinkList& L, int i, int e) {
LNode* p = GetElem(L, i);
LNode* pre = L;
for (int j = 0; j < i; j++) {
pre = pre->nextNode;
}
LNode* newNode = (LNode*)malloc(sizeof(LNode));
newNode->data = e;
newNode->nextNode = p;
pre->nextNode = newNode;
}
求表长
int Length(LinkList L) {
int res = 0;
LNode* p = L->nextNode;
while (p) {
p = p->nextNode;
res++;
}
return res;
}
删除结点
int ListDelete(LinkList& L, int i) {
LNode* node = GetElem(L, i);
if (node==NULL)
{
printf("删除的结点不存在\n");
return -1;
}
else {
if (i == 0) {
L->nextNode = node->nextNode;
}
else {
LNode* pre = GetElem(L, i - 1);
pre->nextNode = node->nextNode;
}
return node->data;
}
}
打印
void PrintList(LinkList L) {
LNode* p = L->nextNode;
printf("表数据:");
while (p) {
printf("%d ", p->data);
p = p->nextNode;
}
printf("\n");
}
销毁
void DestroyList(LinkList& L) {
LNode* p;
while (L) {
p = L;
L = L->nextNode;
free(p);
}
}
测试
int main() {
LinkList L;
InitList(L);
ListInsert(L, 0, 4);
ListInsert(L, 0, 3);
ListInsert(L, 0, 2);
ListInsert(L, 0, 1);
PrintList(L);
LocateElem(L, 4);
ListInsert(L, 3, 99);
PrintList(L);
ListDelete(L, 1);
PrintList(L);
printf("表长:%d\n", Length(L));
return 0;
}
大佬批评指正
|