数组模拟:
单链表:
代码:
// head是头指针指向节点的下标,e[]存储节点的值,ne[]存储节点的next指针指向节点的下标
//idx表示当前我们要对第几个节点进行操作
int head, e[N], ne[N], idx;
// 初始化
void init()
{
//起初head指向空,空节点下标定义为-1
head = -1;
idx = 0;
}
// 在链表头插入一个数a
void insert(int a)
{
e[idx] = a, ne[idx] = head, head = idx ++ ;
}
//把x的值插到下标为k的点后面
void add(int k,int x){
e[idx]=x,ne[idx]=ne[k],ne[k]=idx,idx++;
}
//把k号节点后面的数删除
void delete(int k){
ne[k]=ne[ne[k]];
}
// 将头结点删除,需要保证头结点存在
void remove()
{
head = ne[head];
}
头插法:
#include<iostream>
using namespace std;
typedef struct Node {//创建进程控制块
int data;
struct Node *next;//指向下一个结点的指针
}*LinkList;
LinkList head, tail;
//头插法创建单链表
void head_create()
{
head = new Node();
head->next = NULL;
int n = 0;
cout << "总共生成多少进程" << '\n';
cin >> n;
for (int i = 0; i < n; i++)
{
LinkList p = (LinkList)malloc(sizeof(Node));
cout << "请输入第" << i + 1 << "个数的数值";
cin >> p->data;
p->next = head->next;
head->next = p;
}
}
尾插法:
//尾插法建立单链表
void bottom_create()
{
head = (LinkList)malloc(sizeof(Node));
tail = (LinkList)malloc(sizeof(Node));
head->next = NULL;
tail = head;
LinkList p;
int n = 0;
cout << "总共生成多少进程" << '\n';
cin >> n;
for(int i=0;i<n;i++)
{ p = (LinkList)malloc(sizeof(Node));
cout << "请输入第" << i + 1 << "个数的数值";
cin >> p->data;
tail->next = p;
tail = p;
}
tail->next = NULL;
}
尾插法建立循环单链表:
//尾插法建立循环单链表
void bottom_createshuang()
{
head = (LinkList)malloc(sizeof(Node));
tail = (LinkList)malloc(sizeof(Node));
head->next = head;
tail = head;
LinkList p;
int n = 0;
cout << "总共生成多少进程" << '\n';
cin >> n;
for (int i = 0; i < n; i++)
{
p = (LinkList)malloc(sizeof(Node));
cout << "请输入第" << i + 1 << "个数的数值";
cin >> p->data;
tail->next = p;
p->next=head->next;
tail=p;
}
}
void coutxunhuan()//循环单链表
{
LinkList p;
p = (LinkList)malloc(sizeof(Node));
p=head->next;
do
{
cout << p->data << '\t';
p = p->next;
} while (p != head->next);
}
void coutdata() //单链表
{
LinkList p;
p = (LinkList)malloc(sizeof(Node));
p = head->next;
while (p)
{
cout << p->data << '\t';
p = p->next;
}
}