#include<stdio.h>
#include<stdlib.h>
typedef struct Node {
int data;
struct Node* next;
}Node;
//创建带头结点的单链表
Node* initNode() {
Node* Head = (Node*)malloc(sizeof(Node));//
Node *L = Head;//链表L申请内存
Node* LNew;
L->next = NULL;
for (int i = 0; i < 5; i++) {
LNew = (Node*)malloc(sizeof(Node));
LNew->next = NULL;
LNew->data = i;
L->next = LNew;
L = LNew;
}
return Head;//将头节点指针所带的地址传回去
}
//头插法(有头节点)
void headInsert(Node** L, int i) {
Node* temp = (Node*)malloc(sizeof(Node));
temp->data = i;
temp->next = (*L)->next;
(*L)->next = temp;
}
//尾插法(有头节点)
void tailInsert(Node** L, int i) {
Node* p = *L;//创建指针p遍历链表,直到p->next==NULL时停止。
Node* temp = (Node*)malloc(sizeof(Node));
temp->data = i;
while (1) {
if (p->next == NULL)
break;
p = p->next;
}
p->next = temp;
temp->next = NULL;
}
//删除链表某数值对应的节点
void deleteNode(Node** L, int e) {
if ((*L == NULL))
return;
if ((*L)->data == e) {
*L = (*L)->next;
}
else {
deleteNode(&(*L)->next, e);
}
}
//遍历单链表(带头结点)
void prNode(Node* L) {
Node* node = L->next;
while (node)//当node=NULL时 ,循环停止
{
printf("node=%d\n", node->data);
node = node->next;
}
}
int main() {
//初始化赋值链表(属于尾插法)
Node*L=initNode();
//头插法赋值
headInsert(&L, 99);//函数参数要用Node**类型的,Node*类型的无法修改指针L的值,&获取指针L的地址。
//尾插法赋值
tailInsert(&L, 66);
//删除链表某数值
deleteNode(&L, 2);
//遍历链表
prNode(L);
return 0;
}
----------------------------------------------------------------------------------------------------------------------------------
#include<stdio.h>
#include<stdlib.h>
typedef struct Node {
int data;
struct Node* next;
}Node;
//单链表的创建
Node* InitList() {
//带头结点
/*Node* Head,* L, *LNew;
Head = (Node*)malloc(sizeof(Node));
L = Head;
L->next = NULL;
for (int i = 0; i < 3; i++) {
Node* LNew = (Node*)malloc(sizeof(Node));
LNew->data = i;
LNew->next = NULL;
L->next = LNew;
L = LNew;
}*/
//不带头结点
Node* Head, * L, * LNew;
Head = (Node*)malloc(sizeof(Node));
L = Head = NULL;
for (int i = 0; i < 5; i++) {
LNew = (Node*)malloc(sizeof(Node));
LNew->data = i;
LNew->next = NULL;
if (L == NULL) {
L = Head = LNew;
}
else {
L->next = LNew;
}
L = LNew;
}
return Head;
}
//头插法插入数据
void headInsert(Node** L, int data) {
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
if (L == NULL) {
*L = node;
(*L)->next = NULL;
}
if (node == NULL) {
printf("头插入失败!");
exit(1);
}
else {
node->next = *L;
*L = node;
}
}
//尾插法插入数据
void tailInsert(Node** L, int data) {
Node* node = *L;
while(1){
node = node->next;
if (node->next == NULL)
break;
}
Node* n = (Node*)malloc(sizeof(Node));
if (n == NULL) {
printf("尾插入失败!\n");
exit(1);
}
else
{
n->next = NULL;
n->data = data;
node->next = n;
}
}
//删除链表
void deleteNode(Node** L,int i) {
if (*L == NULL)
return;
if ((*L)->data == i)
{
*L = (*L)->next;
/*
使原本指向当前结点的指针指向下一个结点[等价于L->next = L->next->next],
因此下面的语言不会断链
*/
deleteNode(L, i);
}
else {
deleteNode(&((*L)->next), i);
}
}
//遍历链表
void PrList(Node* L) {
Node* node = L;
while (node) {
printf("node=%d\n", node->data);
node = node->next;
}
}
//逆转链表
//建立新的链表(浪费内存空间,不推荐)
Node* reverseNode1(Node* L) {
Node* node = (Node*)malloc(sizeof(Node));
node = NULL;
while (L!= NULL) {
Node* LNew = (Node*)malloc(sizeof(Node));
LNew->data = L->data;
if (node==NULL) {
node = LNew;
node->next = NULL;
}
else {
LNew->next = node;
node = LNew;
}
L = L->next;
}
return node;
}
//创建三个指针逆转链表
Node* reverseNode2(Node* L) {
Node* p, * q, * r;
p = L;
q = p->next;
p->next = NULL;
r = q->next;
for (; r != NULL;r = q->next) {
q->next = p;
p = q;
q = r;
}
q->next = p;
return q;
}
int main() {
Node* L = InitList();
headInsert(&L, 99);
tailInsert(&L, 66);
deleteNode(&L, 2);
PrList(L);
return 0;
}
本人水平有限,如有不对的地方欢迎大神斧正!