一、C语言版本链表:
方向1:无表头
法一:尾插法
#include<stdio.h>
#include<malloc.h>
//打印 创建 释放 删除某个数 插入某个数 (T_T)5个功能
struct Node
{int data;struct Node* next;
};
typedef struct Node Node;void print(Node* head);
Node* creat();
void release(Node* head);
Node* Delete(Node* head, int num);
Node* Insert(Node* head, int num);int main()
{int num;int num2;//需要插入的数Node* head;head = creat();printf("\n");print(head);printf("\n");printf("请输入你要删除:\n");scanf_s("%d",& num);head=Delete(head, num);print(head);printf("\n");printf("请输入你要插入的数字:\m");scanf_s("%d", &num2);release(head);return 0;
}//创建链表函数,返回值为head指针
//动态申请
Node* creat()
{//值得令人注意的是typedef的*无法将后面都改成指针类型int num;Node* p, * head = NULL, * tailor = NULL;//注意先初始化为0scanf_s("%d", &num);//以输入的数字为-999为终止条件while (num != -999){p = (Node*)malloc(sizeof(Node));p->data = num;p->next = NULL;//容易忘if (head == NULL){head = p;}else{tailor->next=p;//保证p是尾插进去的,指向最后一个}tailor = p;//更新tailorscanf_s("%d", &num);}return (head);
}void print(Node* head)
{Node* p = head;if (p == NULL){printf("空链表\n");}else{printf("链表如下:\n");while (p != NULL){printf("%5d", p->data);p = p->next;}}
}
void release(Node* head)
{Node* p1=head, *p2;//释放需要定义两个工作指针!!!!while (p1 != NULL){p2=p1;//p2用来释放p1 = p1->next;//p1更加靠前free(p2);}printf("释放成功!!!!");
}
Node* Delete(Node* head, int num)
{Node* p1, * p2=NULL;//两个工作指针if (NULL == head){printf("该链表为air链表!!");return (head);}p1 = head;while (p1->next && p1->data != num)//定位!同时保证p2在p1后面{p2 = p1;p1 = p1->next;}if (p1->data == num){if (p1 == head){head = p1->next;}else{p2->next = p1->next;}free(p1);printf("\n释放成功!");}else{printf("删除失败");}return head;
}
//在有序链表从小到大存放的前提下
Node* Insert(Node* head, int num)//插入数据num
{Node* p, * p1, * p2=NULL;//同样的,两个工作指针p = (Node*)malloc(sizeof(Node));p->data = num;p->next = NULL;p1 = head;while (p1->next && p->data > p1->data)//定位{p2 = p1;p1 = p1->next;}if (p1 == head){p1->next = head;head = p1;}else{p2->next = p;p->next = p1;}printf("数据插入成功!!!");return head;
}
法二:前插法
#include<stdio.h>
#include<malloc.h>struct Node
{int data;struct Node* next;
};
typedef struct Node Node;void print(Node* head);
Node* creat();
void release(Node* head);int main()
{Node* head;head = creat();printf("\n");print(head);release(head);return 0;
}//创建链表函数,返回值为head指针
//动态申请
//前插法
Node* creat()
{//值得令人注意的是typedef的*无法将后面都改成指针类型int num;Node* p, *head = NULL, *tail = NULL;scanf_s("%d", &num);//以输入的数字为-999为终止条件while (num != -999){p = (Node*)malloc(sizeof(Node));p->data = num;p->next = NULL;//容易忘if (tail == NULL){tail= p;}else{p->next=head;}head= p;//更新headscanf_s("%d", &num);}return (head);
}void print(Node* head)
{Node* p = head;if (p == NULL){printf("空链表\n");}else{printf("链表如下:\n");while (p != NULL){printf("%5d", p->data);p = p->next;}}
}
void release(Node* head)
{Node* p1 = head, * p2;while (p1 != NULL){p2 = p1;p1 = p1->next;free(p2);}printf("释放成功!!!!");
}
方向二:有表头
方法:前插法
#include<cstdio>
#include<iostream>using namespace std;
struct Node
{int data;Node* next;
};
Node* creatList()
{Node* headNode = new Node;headNode->next = nullptr;return headNode;
}
Node* creatNode(int data)
{Node* node = new Node;node->data = data;node->next = nullptr;return node;
}
void insertData(Node*headNode,int data)
{Node* newNode = creatNode(data);newNode->next = headNode->next;headNode->next = newNode;
}
void printList(Node* headNode)
{Node* pMove = headNode->next;//注意:表头是不用打印的。while (pMove != nullptr){cout << pMove->data << "\t";pMove = pMove->next;}
}
void testList()
{Node* list = creatList();//创建链表表头。insertData(list, 10);insertData(list, 13);insertData(list, 21);insertData(list, 666);printList(list);
}
int main()
{testList();return 0;
}
二、C++版本链表
推荐Node用struct,无需考虑权限写接口的问题
#include<iostream>using namespace std;
struct Node
{int data;Node* next;
};
class List
{
public:void creatList(){headNode = new Node;headNode->next = nullptr;}void creatNode(int data) //有表头前插法{Node* newNode = new Node;newNode->data = data;newNode->next = headNode->next;headNode->next = newNode;}void printList(){Node* pMove = new Node;pMove = headNode->next;//注意头结点不算,要指向下一个while (pMove != nullptr){cout << pMove->data << " ";pMove = pMove->next;}}
protected:Node* headNode;
};
void testList()
{List list;list.creatList();list.creatNode(3);list.creatNode(2);list.creatNode(1);list.printList();
}
int main()
{testList();return 0;
}
此间出了一个bug:
不能写Node* headNode=new Node; 否则就变成了局部变量,在下面print和insert中headNode就属于为初始化的状态,会报错!