简介:
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
图示:
C语法:两种实现
第一种:
#include<bits/stdc++.h>
using namespace std;
typedef struct Node{
int data;
Node *next;
}*List;
void init_list(List &hed){//内存空间分配问题
hed = new Node;
hed->next = NULL;
}
void insert(List &hed, int e){
List temp = new Node;
temp->data = e;
temp->next = hed->next;
hed->next = temp;
}
void print_list(List &hed){
for(List i = hed->next; i; i = i->next)
cout << i->data << " ";
}
int main(){
List hed;
init_list(hed);
for(int i = 1; i <= 5; i++)
insert(hed, i);
print_list(hed);
return 0;
}
第二种:
struct Node{
int data;
Node *next;
};
void init_list(Node *hed){//内存空间分配问题
hed->next = NULL;
}
void insert(Node *hed, int e){
Node *temp = new Node;
temp->data = e;
temp->next = hed->next;
hed->next = temp;
}
void print_list(Node *hed){
for(Node *i = hed->next; i; i = i->next)
cout << i->data << " ";
}
//以下部分同上
实质上都是指针指向内存空间。前者较方便一些,后者较容易理解一些。
指定位置赋值
根据链表的特性,从初始位置开始遍历,如果节点个数=下标,则调用插入函数。
bool insert_index(List &hed, int index, int e){//关键在于找到该节点,然后调用insert
int count = 0;
bool flag = false;
for(List i = hed->next; i; i = i->next, count++){
if(count == index){
insert(i, e);
flag = true;
}
}
return flag;
}
获取链表长度
int size_list(List &hed){
int count = 0;
for(List i = hed->next; i; i = i->next)
count++;
return count;
}
删除指定位置元素
bool delete_index(List &hed, int index){
if(index > size_list(hed)) return false;//防止index > size
int count = 0;
bool flag = false;
for(List i = hed->next; i; i = i->next, count++){
if(count == index - 1){
List temp = i->next;
i->next = temp->next;
delete temp;
flag = true;
}
}
return flag;
}