带头结点的单链表的创建(头插法和尾插法)
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct Node {
int data; //数据域
struct Node*next; //指针域
}LinkNode; //单链表节点类型
//头插法建立链表,带头结点
void CreateLinkHead(LinkNode*&L,int a[],int n) {
L = (LinkNode *)malloc(sizeof(LinkNode));//创建头结点
L->next = NULL; //将头结点next域置空
LinkNode *s; //创建结点s
for (int i = 0; i < n; i++) {
s = (LinkNode *)malloc(sizeof(LinkNode)); //给结点s开辟空间
s->data = a[i]; //给结点s的数据域赋值
s->next = L->next; //头插法进行插入
L->next = s;
}
}
//尾插法建立链表,带头结点
void CreateLinkEnd(LinkNode*&L, int a[], int n) {
L = (LinkNode *)malloc(sizeof(LinkNode));//创建头结点
L->next = NULL; //将头结点next域置空
LinkNode *s,*r; //创建结点s和结点r
r = L; //开始的时候头结点和尾节点是同一个结点
for (int i = 0; i < n; i++) {
s = (LinkNode*)malloc(sizeof(LinkNode)); //给结点s开辟空间
s->data = a[i]; //给结点s的数据域赋值
r->next = s;
r = s;
}
r->next = NULL;
}
//输出看对不对
void display(LinkNode *L) {
LinkNode *p = L->next; //指向有数据的第一个结点
while (p!=NULL) {
cout << p->data<<" ";
p = p->next;
}
}
int main() {
LinkNode *L;
cout << "请输入链表的数据的个数:";
int n;
cin >> n;
int *a = new int[n]; //用数组来接收链表的数据
//注意这里不能用int *a = new int(n),会报错的哟
for (int i = 0; i < n;i++) {
cin >> a[i];
}
CreateLinkHead(L,a,n); //调用头插法的函数,这里输出的是倒序哦
cout << "输出链表数据:" << endl;
display(L);
cout << endl;
CreateLinkEnd(L, a, n); //调用尾插法的函数,这里输出的是正序哦
cout << "输出链表数据:" << endl;
display(L);
cout << endl;
system("pause");
}
输出结果为:
请输入链表的数据的个数:5
1 3 6 9 5
输出链表数据:
5 9 6 3 1
输出链表数据:
1 3 6 9 5
请按任意键继续. . .