C语言实现单链表
结构体定义
typedef struct LNode {
int data;
struct LNode *next;
} LNode, *LinkList;
函数声明
LinkList headInsertList(LinkList L);
LinkList tailInsertList(LinkList L);
bool insertNextNode(LNode *p, int e);
bool insertPriorNode(LinkList L, LNode *p, int e);
bool insertListByIndex(LinkList L, int i, int e);
bool delteNodeByIndex(LinkList L, int i);
LNode *getElem(LinkList L, int i);
LNode *locateElem(LinkList L, int e);
void listPrint(LinkList L);
int getLength(LinkList L);
bool isEmpty(LinkList L);
头插法建立单链表
LinkList headInsertList(LinkList L) {
int e;
LNode *s;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
printf("输入数据,输入9999结束:");
scanf("%d", &e);
while (e != 9999) {
s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = L->next;
L->next = s;
scanf("%d", &e);
}
return L;
}
尾插法建立单链表
LinkList tailInsertList(LinkList L) {
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
LNode *s, *tail = L;
int e;
printf("输入数据,输入9999结束:\n");
scanf("%d", &e);
while (e != 9999) {
s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = NULL;
tail->next = s;
tail = tail->next;
scanf("%d", &e);
}
return L;
}
节点的后插操作
bool insertNextNode(LNode *p, int e) {
if (p == NULL)
return false;
LNode *q = (LNode *)malloc(sizeof(LNode));
if (q == NULL) {
return false;
}
q->data = e;
q->next = p->next;
p->next = q;
return true;
}
节点的前插操作
bool insertPriorNode(LinkList L, LNode *p, int e) {
if (p == NULL)
return false;
LNode *s = L;
LNode *q = (LNode *)malloc(sizeof(LNode));
q->data = p->data;
p->data = e;
q->next = p->next;
p->next = q;
return true;
}
在第i个位置插入节点
bool insertListByIndex(LinkList L, int i, int e) {
if (i < 1)
return false;
int j = 0;
LNode *p = L;
while (p != NULL && j < i - 1) {
p = p->next;
j++;
}
if (p == NULL)
return false;
return insertNextNode(p, e);
}
删除第i个节点
bool delteNodeByIndex(LinkList L, int i) {
LNode *p = getElem(L, i - 1);
if (p == NULL || p->next == NULL) {
printf("删除的位置不合法!\n");
return false;
}
LNode *s = p->next;
p->next = s->next;
free(s);
return true;
}
按照位序查找节点值
LNode *getElem(LinkList L, int i) {
if (i < 0)
{
printf("插入的位置不能小于1!\n");
return NULL;
} else if (i == 0) {
printf("该节点为头节点,无数据!\n");
return NULL;
} else {
int j = 0;
LNode *p = L;
while (p != NULL && j < i) {
p = p->next;
j++;
}
return p;
}
}
按照值查找节点位序
LNode *locateElem(LinkList L, int e) {
LNode *p = L->next;
while (p != NULL && p->data != e) {
p = p->next;
}
return p;
}
遍历链表
void listPrint(LinkList L) {
printf("打印链表...\n");
LNode *p = L->next;
int i = 1;
while (p != NULL) {
printf("第%d个元素为:%d\n", i, p->data);
i++;
p = p->next;
}
}
求链表长度
int getLength(LinkList L) {
LNode *p = L;
int i = 0;
while (p->next != NULL) {
i++;
p = p->next;
}
return i;
}
判断链表是否为空
bool isEmpty(LinkList L) { return L->next == NULL; }
运行结果
![运行结果](https://img-blog.csdnimg.cn/70a4693832cc417ba8e90de0b96c8c09.png)