单链表简单实现
初始化
void InitList(LinkList& L) {
L = (LinkList)malloc(sizeof(LNode)); // 产生头结点,L指向此头结点
if (!L) exit(-1); // 存储分配失败
L->next = NULL; // 指针域为空,空链表
}
插入
p与j同步,遍历到i-1
bool ListInsert(LinkList L, int i, int e) { //不改变L,不用&
LinkList p = L;
int j = 0;
while (p && j < i - 1) { // 寻找第i-1个结点
p = p->next;
++j;
}
if (!p || j > i - 1) // i小于1或者大于表长
return false;
LinkList tmp = (LinkList)malloc(sizeof(LNode)); // 生成新结点
if (!tmp) exit(-1);
tmp->date = e; // 插入L中
tmp->next = p->next;
p->next = tmp;
return true;
}
删除
p与j同步,遍历到i-1,p->next指向前一个
bool ListDelete(LinkList L, int i, int& e) {
LinkList p = L;
int j = 0;
while (p->next && j < i - 1) { // 寻找第i个结点,并令p指向其前驱
p = p->next;
++j;
}
if (!p->next || j > i - 1) // 删除位置不合理
return false;
LinkList q = p->next; // 删除并释放结点
e = q->date;
p->next = q->next;
free(q);
return true;
}
遍历
void ListTraverse(LinkList L) {
LinkList p = L->next;
while (p) {
printf("%d ", p->date);
p = p->next;
}
printf("\n");
}
测试
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct LNode {
int date;
LNode* next;
}LNode, * LinkList;
int main() {
int e;
LinkList L;
InitList(L); //初始化
for (int j = 1; j <= 5; j++) //插入1-5
ListInsert(L, 1, j);
printf("在L的表头依次插入1~5后:L=");
ListTraverse(L);
for (int j = 1; j <= 5; j++) //删除1-5
ListDelete(L, 1, e);
for (int j = 1; j <= 10; j++) //插入1-10
ListInsert(L, j, j);
printf("在L的表尾依次插入1~10后:L=");
ListTraverse(L);
printf("依次输出L的元素:");
ListTraverse(L);
return 0;
}