初识线性链表

目录

线性链表概述及其结构

线性链表的基本操作

1:链表的创建操作

2:链表插入

3:链表删除


线性链表概述及其结构

  所谓“线性”,即为一组数据元素形成前后关系。线性表主要以2种形式在内存中存放,一种是以数组的形式,用数组存放时是连续存放的,当我们需要对其中一个数据元素进行删除或者插入时,需要移动其他数据,并且用数组还需要申请合适的内存空间,太小装不下,太大会造成内存空间浪费。这时,就需要我们的线性链表出手,链表不需要在内存里面连续存放,而是以指针将各数据单元链接起来,所以,我们在进行删除或者插入数据元素时,不需要移动其他数据元素。

  现在正式介绍链表,链表是由一系列的结点组成,每个节点包含两个域,一个是数据域,主要用来保存用户数据,可以是任意数据类型;另一个叫指针域,用来保存下一个结点的地址。一个完整的链表包含头结点,中间结点,尾结点(有些代码可没有有尾结点)。其中头结点的数据域是不存放有效数据的,它的指针域存放实际数据链表的第一个数据单元的地址。尾结点的指针域指向NULL(空),作为链表结束的标志。下面是一个线性链表逻辑图借以参考:

基本结构已经知晓,那么接下来就是定义一个结点,定义结点用结构体类型来定义: 

struct  LinkNode       //LinkNode为结点结构体类型名

{

   int data;                 //数据成员定义

struct  LinkNode *next;          //定义指针域(结点结构体类型名 *指针变量名)

};

线性链表的基本操作

  线性链表的基本操作包括创建,插入,删除,输入,销毁等。

1:链表的创建操作

基本思路:就是往空链表中插入若干个结点,并保持前后驱动关系。先创建一个头结点,让head和tail都指向它,并让它的指针域为空,再创建新的数据结点,用指针pnew指向新的数据结点,并将实际的数据放在该结点的数据域,而他的指针域置为NULL,最后将该节点插入到tail所指向结点的后面,同时使tail指向pnew所指向的结点 

代码形式如下: 

 

#include <stdio.h>
#include <stdlib.h>
Node *Create_LinkList()
{
  int score;
  Node *head,*tail,*pnew;
head=(Node *)malloc(sizeof(Node));        //创建头结点
if(head==NULL)             //创建失败,则返回
{
  printf("no enough memory\n");
return(NULL);
}
head->next=NULL;      //头结点的指针域置于NULL
tail=head;            //开始时尾指针指向头指针
printf("input the score of students:\n");
while(1)              //创建学生线性链表
{
scanf("%d",&score);    //接收成绩
if(score<0)            //成绩为负,退出
break;
pnew=(Node *)malloc(Sizeof(Node));      //创建一个新结点
if(pnew==NULL)               //若创建失败,返回
{
printf("no enough memory\n");
return(NULL);
}
pnew->score=score;       //新结点数据域放输入的成绩
pnew->next=NULL;         //新结点指针域指向NULL
tail->next=pnew;         //新结点插入到链表尾
tail=pnew;                //
}
return(head);
}

2:链表插入:

插入就只需要两步:

void insertData( Node *LinkList,*pnew,int data)

{

Node *newNode=create(data);       

newNode->next=headNode->next;      //第一步

headNode->next=newNode;                //第二步

}

3:链表删除:

 

删除只需要一步,即图中绿色线的步骤:

preNode->next=curNode->next;

free(curNode);

链表的基本操作还有很多,在这就只讲述了三种,待掌握成熟,会继续精进,感谢友友的读取,记得一键三连哟,阿里嘎多 ,懒洋洋桑!

 

 

 

 

这道题目是要求我们实现链表的基本操作,包括创建链表、插入节点、删除节点、遍历链表等。以下是一个简单的链表实现代码示例: ```c++ #include <iostream> using namespace std; // 定义链表节点结构体 struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; // 创建链表 ListNode* createList(int nums[], int n) { if (n == 0) return NULL; ListNode *head = new ListNode(nums[0]); ListNode *cur = head; for (int i = 1; i < n; i++) { cur->next = new ListNode(nums[i]); cur = cur->next; } return head; } // 插入节点 void insertNode(ListNode *&head, int pos, int val) { if (pos < 0) return; if (pos == 0) { ListNode *newNode = new ListNode(val); newNode->next = head; head = newNode; return; } ListNode *cur = head; while (cur && pos > 1) { cur = cur->next; pos--; } if (cur) { ListNode *newNode = new ListNode(val); newNode->next = cur->next; cur->next = newNode; } } // 删除节点 void deleteNode(ListNode *&head, int pos) { if (pos < 0) return; if (pos == 0) { ListNode *delNode = head; head = head->next; delete delNode; return; } ListNode *cur = head; while (cur && pos > 1) { cur = cur->next; pos--; } if (cur && cur->next) { ListNode *delNode = cur->next; cur->next = delNode->next; delete delNode; } } // 遍历链表 void traverseList(ListNode *head) { while (head) { cout << head->val << " "; head = head->next; } cout << endl; } int main() { int nums[] = {1, 2, 3, 4, 5}; int n = sizeof(nums) / sizeof(int); ListNode *head = createList(nums, n); traverseList(head); insertNode(head, 2, 6); traverseList(head); deleteNode(head, 3); traverseList(head); return 0; } ``` 在上面的代码中,我们定义了一个 `ListNode` 结构体作为链表节点,包括节点值 `val` 和指向下一个节点的指针 `next`。同时,我们实现了创建链表、插入节点、删除节点和遍历链表等基本操作。在使用链表时,我们可以先通过 `createList` 函数创建一个链表,然后对链表进行插入、删除和遍历操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值