本人当初在学习数据结构的时候,一直搞不清楚代码(其实就是自己没练)。现在自己学后。就写了一个之前在网上抄作业看见的输出一样的程序。希望可以帮助学弟学妹们学习理解链表代码的编写。因为网上叙述链表原理的博客和文章特别多。我这里就不赘述了。上代码。
ps:因为是我自己按照自己的想法来写的,肯定不是最优解。望各位大佬见谅。
// hello Word.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include<malloc.h> //分配内存
#include<stdio.h> //
typedef struct ListNode {
int data; //数据存放点
struct ListNode* next; //后继指向
}ListNode; //结构体别名
//链表生成函数,返回类型为ListNode节点类型(返回头节点)
ListNode*Initlist(int n) //n链表为长度
{
ListNode *head, *p, * s; //头结点,链表构建指针变量,链表接入指正变量
head = (ListNode*)malloc(sizeof(ListNode));//固定语法,动态分配内存给头结点
head->next = NULL; //现在还是空链表,末尾指向NULL
int i = 1;
p = head;
while(n)
{
printf("请输入第""%d""节点的值",i);
s = (ListNode*)malloc(sizeof(ListNode));//接入的指针变量的动态内存分配
scanf_s("%d", &s->data ); //输入数据
s->next = NULL; //尾结点指向空
p->next = s; //将s点链接到p后面
p = p->next; //p指向其下一节点,即s点
n-=1; //剩余长度值修正
i++;
}
return head; //返回头结点
}
链表增加函数
ListNode* Add(ListNode* head,int opo,int data){//opo为添加的位置,date为需要添加的数据
ListNode* p = head; //建立指向点,并指向头结点
for (int i = 1; i < opo; i++) {//找出需要添加位置的上一节点。
if (p->next == NULL) { //若链表下一级指向空,则证明已经到达链表最后节点
printf("链表长度不够,无法插入");
return NULL;
// break;
}
p = p->next;
}
//插入
ListNode* a = (ListNode*)malloc(sizeof(ListNode));
a->data = data;
a->next = p->next;
p->next = a;
return head;
}
按照位删除
ListNode* Dele(ListNode* head, int e){
ListNode* p = head;
for(int i=1;i<e;i++){
if (p->next == NULL){
printf("你要删除的位置大于链表长度");
printf("\n");
return head;
}
p = p->next;
}
//删除
p->next = p->next->next;
return head;
}
/按位更改
ListNode* Correct(ListNode* head,int opo,int data) {
ListNode* p = head;
for (int i = 1; i <= opo; i++) {
if (p->next == NULL) {
printf("你要更改的位置不存在");
printf("\n");
return head;
}
p = p->next;
}
p->data = data;
return head;
}
/按位查找
ListNode* find(ListNode* head,int opo,int len) {
ListNode* p = head;
int i = 1;
if(opo>len){ //检查该位置是否超出链表最大长度
printf("该位置超出最大链表长度");
return head;
}
for (i; i <= opo;i++) {//开始检索该位置
p = p->next;
}
printf("你找的数据为""%d\n", p->data);
return head;
}
按照值删除
ListNode* DDele(ListNode* head, int data,int len){
ListNode* h = head;
ListNode* p = h->next;
int w = 1;// while (p->next)
for(int i = 1;i<=len;i++){
if (p->data == data){
if (p->next == NULL) //尾结点
{
h->next = NULL;
w++;
continue;
}
else if(p->next) { //普通节点
h->next = p->next;
p = p->next;
w++;
continue;
}
}
h = h->next;//若非需要的值就直接下一跳
p = p->next;
}
if (w == 1)
printf("该值不存在链表中\n");
return head;
}
//按值更改
ListNode* DCorrect(ListNode* head,int data1,int data2,int len) {
ListNode* p = head;
int w = 0;
for (int i = 0; i <= len; i++) {
if (p->data == data1) {
p->data = data2;
w++;
}
p = p->next;
}
if (w == 0) {
printf("本链表中不存在该数\n");
}
return head;
}
///按值查找
ListNode* Dfind(ListNode* head,int data,int len) {
ListNode* p = head;
int w = 0;
for (int i = 0; i < len; i++) {
if (p->data == data) {
printf("该数据的位置为""%d\n",i);
w++;
}
p = p->next;
}
if (w == 0)
printf("该链表中不存在该值\n");
return head;
}
打印链表函数
void display(ListNode* head){
ListNode* p = head; //实例化一个结构体,并指向头结点。以此来作为打印点
printf("链表当前状态为");
while (p->next) {
p = p->next;
printf("%d", p->data);
}
printf("\n");
}
//主函数
int main()
{
int len,data,opo; //定义链表长度,添加值,位置
int data1,data2,dos;
printf(" 欢迎进入林哥链表模拟器 \n"); //装逼
printf("请输入你需要的链表长度"); //生成长度
scanf_s("%d", &len);
ListNode* p = Initlist(len); //链表生成
display(p); //链表打印
printf("\n");
while (1){
printf("按位置增加输入 1 按照位置删除输入 2\n");
printf("按位置改动输入 3 按照位置查找输入 4\n");
printf("按数据删除输入 5 按照数据更改输入 6\n");
printf("按数据查找输入 7 \n");
scanf_s("%d", &dos);
if (dos == 1) {
printf("请输入需要插入的位置"); ///插入
scanf_s("%d", &opo);
printf("请输入需要插入的值");
scanf_s("%d", &data);
p = Add(p, opo, data);
display(p); //链表打印
printf("\n");
}
else if (dos == 2) {
printf("请输入需要删除的位置"); //按位删除
scanf_s("%d", &opo);
p = Dele(p, opo);
display(p);
printf("\n");
}
else if (dos == 3) {
printf("请输入需要更改的位置"); //按位更改
scanf_s("%d", &opo);
printf("请输入需要更改进入的值");
scanf_s("%d", &data);
p = Correct(p, opo, data);
display(p);
printf("\n");
}
else if (dos == 4) { //按位查找
printf("请输入你需要寻找的位置");
scanf_s("%d", &opo);
p = find(p, opo, len);
display(p);
printf("\n");
}
else if (dos == 5) { //按数据删除
printf("请输入需要删除的值");
scanf_s("%d", &data);
p = DDele(p, data, len);
display(p);
printf("\n");
}
else if (dos == 6) { //按照数据更改
printf("请输入你需要寻找的值");
scanf_s("%d", &data1);
printf("请输入你需要寻跟换的值");
scanf_s("%d", &data2);
p = DCorrect(p, data1, data2, len);
display(p);
printf("\n");
}
else if (dos == 7) { //按照数据寻找
printf("请输入你需要寻找位置的值");
scanf_s("%d", &data);
p = Dfind(p, data, len);
display(p);
printf("\n");
}
else
break;
}
printf("拜拜");
}