单链表的创建:头插法
#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
typedef int ElemType;
/*定义一个单链表*/
typedef struct LNode{
ElemType data;
/*下一个元素的地址指针*/
struct LNode *next;
} LNode,*LinkList;
/**
*单链表的创建
* @return
*/
LinkList CreateListByHead(LinkList L){
/*中间指针 */
LNode *s;
/*存入的元素*/
int x;
/*创建头节点:申请空间*/
L=(LinkList) malloc(sizeof (LNode));
/*对头结点进行初始化:*/
L->next=NULL;
/*读取传入的元素*/
scanf("&d",&x);
while (x !=999){
/*创建新的节点*/
s = (LinkList) malloc(sizeof(LNode));
s->data=x;
/*中间指针存储的地址为:头指针的地址*/
s->next = L->next;
/*重新设置 头结点存储的指针:为插入元素的地址*/
L->next=s;
scanf("%d",&x);
}
/*返回头节点*/
return L;
}
int main()
{
LinkList L;
CreateListByHead(L);
return 0;
}
单链表的创建:尾插法
#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
typedef int ElemType;
/*定义一个单链表*/
typedef struct LNode{
ElemType data;
/*下一个元素的地址指针*/
struct LNode *next;
} LNode,*LinkList;
/**
*单链表的创建: 使用尾插法
* @return
*/
LinkList CreateListByTail(LinkList L){
/*中间指针 */
LNode *s;
/*存入的元素*/
int x;
/*创建头结点:申请空间*/
L=(LinkList) malloc(sizeof (LNode));
L->next=NULL;
//初始化:只有一个头结点=尾节点
LNode *r=L;
/*读取传入的元素*/
scanf("&d",&x);
while (x !=999){
/*创建新的节点*/
s = (LinkList) malloc(sizeof(LNode));
s->data=x;
/*更新当前r指针上的元素 存储的下一个地址指针*/
r->next=s;
/*更新尾节点的元素地址:为新插入的元素地址*/
r=s;
scanf("%d",&x);
}
/*插入完成:尾巴置空*/
r->next=NULL;
/*返回头结点*/
return L;
}
int main()
{
LinkList L;
CreateListByTail(L);
return 0;
}
单链表的查找
/* 按位查找,返回第i个位置的节点指针 */
LNode* getElemByPos(LinkList L, int i) {
int j = 0;
LNode *p = L;
while (p != NULL && j < i) {
p = p->next;
j++;
}
return p;
}
单链表的插入节点
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int ElemType;
/* 定义一个单链表 */
typedef struct LNode{
ElemType data;
struct LNode *next;
} LNode, *LinkList;
/* 获取链表长度 */
int length(LinkList L) {
int len = 0;
LNode *p = L->next; // 假设L是一个头节点
while (p != NULL) {
len++;
p = p->next;
}
return len;
}
/* 按位查找,返回第i个位置的节点指针 */
LNode* getElemByPos(LinkList L, int i) {
int j = 0;
LNode *p = L;
while (p != NULL && j < i) {
p = p->next;
j++;
}
return p;
}
/**
* 在L的第i个位置上插入元素值为x的节点
* @param L 链表
* @param i 位序
* @param x 节点上的值
*/
void insertNode(LinkList L, int i, ElemType x) {
if (i < 1 || i > length(L) + 1) {
printf("无效的位置\n");
return;
}
LNode *s = (LinkList) malloc(sizeof(LNode));
s->data = x;
LNode *p = getElemByPos(L, i - 1); // 获取第(i-1)个节点
/* 在p之后插入s */
s->next = p->next;
p->next = s;
}
int main() {
/* 初始化链表L为一个带头节点的空链表 */
LinkList L = (LinkList) malloc(sizeof(LNode));
L->next = NULL;
/* 插入测试数据 */
insertNode(L, 1, 10); // 在第1个位置插入10
insertNode(L, 2, 20); // 在第2个位置插入20
insertNode(L, 1, 5); // 在第1个位置插入5
/* 打印链表 */
LNode *p = L->next;
while (p != NULL) {
printf("%d -> ", p->data);
p = p->next;
}
printf("NULL\n");
/* 释放链表 */
p = L;
while (p != NULL) {
LNode *temp = p;
p = p->next;
free(temp);
}
return 0;
}
单链表的删除节点
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int ElemType;
/* 定义一个单链表 */
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList;
/* 获取链表长度 */
int length(LinkList L) {
int len = 0;
LNode *p = L->next; // 假设L是一个头节点
while (p != NULL) {
len++;
p = p->next;
}
return len;
}
/* 按位查找,返回第i个位置的节点指针 */
LNode* getElemByPos(LinkList L, int i) {
int j = 0;
LNode *p = L;
while (p != NULL && j < i) {
p = p->next;
j++;
}
return p;
}
/* 删除指定位置的节点 */
bool deleteNode(LinkList L, int i, ElemType *e) {
if (i < 1 || i > length(L)) {
return false;
}
/* 被删除节点的前驱节点 */
LNode *p;
/* 辅助指针 */
LNode *q;
p = getElemByPos(L, i - 1);
/* 删除p的后继节点 */
q = p->next;
p->next = q->next;
/* 把值交给e */
*e = q->data;
/* 释放需要删除的节点 */
free(q);
return true;
}
/* 插入节点 */
void insertNode(LinkList L, int i, ElemType x) {
if (i < 1 || i > length(L) + 1) {
printf("无效的位置\n");
return;
}
LNode *s = (LinkList) malloc(sizeof(LNode));
s->data = x;
LNode *p = getElemByPos(L, i - 1); // 获取第(i-1)个节点
/* 在p之后插入s */
s->next = p->next;
p->next = s;
}
int main() {
/* 初始化链表L为一个带头节点的空链表 */
LinkList L = (LinkList) malloc(sizeof(LNode));
L->next = NULL;
/* 插入测试数据 */
insertNode(L, 1, 10); // 在第1个位置插入10
insertNode(L, 2, 20); // 在第2个位置插入20
insertNode(L, 1, 5); // 在第1个位置插入5
/* 打印链表 */
LNode *p = L->next;
while (p != NULL) {
printf("%d -> ", p->data);
p = p->next;
}
printf("NULL\n");
/* 删除节点测试 */
ElemType e;
if (deleteNode(L, 2, &e)) {
printf("已删除节点的值: %d\n", e);
} else {
printf("删除失败\n");
}
/* 再次打印链表 */
p = L->next;
while (p != NULL) {
printf("%d -> ", p->data);
p = p->next;
}
printf("NULL\n");
/* 释放链表 */
p = L;
while (p != NULL) {
LNode *temp = p;
p = p->next;
free(temp);
}
return 0;
}