#include <stdio.h>
#include <stdlib.h>
typedef struct Single {
int data;
struct Single* next;
}Lnode,*Lnodelist;
int empty(Lnodelist L);
void init(Lnodelist&L);
void print(Lnodelist L);
void creathead(Lnodelist& L,int n);
void creattail(Lnodelist &L,int n);
void printnode(Lnodelist L,int n);
void select(Lnodelist L, int n);
void Insert(Lnodelist& L, int n);
void Deletendoe(Lnodelist& L, int n);
void Delete(Lnodelist& L);
void clear(Lnodelist& L);
int main() {
Lnodelist M;
int n;
init(M);
empty(M);
printf("请输入节点数:");
scanf_s("%d", &n);
//creathead(M,n);
creattail(M,n);
print(M);
empty(M);
printnode(M,n);
//select(M, n);
//
//Insert(M, n);
//print(M);
//
//Deletendoe(M, n);
//print(M);
// Delete(M);
clear(M);
empty(M);
}
//判断链表是否为空
int empty(Lnodelist L) {
if (L->next)
{
printf("此时链表不是空的\n");
return 0;
}
else
{
printf("此时链表是空的\n");
return 1;
}
}
//初始化
void init(Lnodelist &L) {
L = new Lnode;
L->next = NULL;
}
//头插法建立
void creathead(Lnodelist& L,int n) {
Lnodelist p;
L = new Lnode;
L->next = NULL;
for (int i = 0; i <n; i++) {
p = new Lnode;
scanf_s("%d", &p->data);
p->next = NULL;
p->next = L->next;
L->next = p;
}
}
//尾插法建立
void creattail(Lnodelist &L,int n) {
Lnodelist p, r;
r = L;
for (int i = 0; i < n; i++) {
p = new Lnode;
scanf_s("%d", &p->data);
r->next = p;
p->next = NULL;
r = p;
}
}
//打印链表
void print(Lnodelist L) {
Lnodelist p;
p=L->next;
printf("链表为:\n");
while(p!=NULL) {
printf("%d ", p->data);
p = p->next;
}
}
//输出第i个节点的元素
void printnode(Lnodelist L,int n) {
Lnodelist p;
p = L;
int i;
printf("请输出要查找数据的位置:");
scanf_s("%d", &i);
while(true){
if (i<1 || i>n)
printf("位置不存在,请重新输入");
break;
}
if (p->data = NULL)
printf("没有数据");
for (int j = 0; j < i; j++) {
p = p->next;
}
printf("%d\n", p->data);
}
//查找数据为多少的位置
void select(Lnodelist L, int n) {
int x;
Lnodelist p; p = L;
int j = 0;//计数器
printf("请输入要查找节点的数据:");
scanf_s("%d", &x);
while(p->data!=x) {
p = p->next;
j++;
}
printf("数据为%d的节点位置在第%d个\n",x, j);
}
//清空单链表
void clear(Lnodelist& L) {
Lnodelist p, q;
p = L->next;
while (p) {
q = p->next;
delete p;
p = q;
}
L->next = NULL;
printf("已清空链表!\n");
}
//销毁单链表
void Delete(Lnodelist& L) {
Lnode* p;
p = L;
while (L) {
p = L;
L = L->next;
delete p;
}
printf("链表已销毁!");
}
//单链表的插入
void Insert(Lnodelist& L, int n) {
Lnodelist p,q;
q = L;
int x;
p = new Lnode;
p->next=NULL;
printf("请输入插入的位置:");
scanf_s("%d", &x);
printf("请输入插入节点的数据:");
scanf_s("%d", &p->data);
for (int j = 0; j < x-1; j++) {
q = q->next;
}
p->next = q->next;
q->next = p;
}
//删除节点
void Deletendoe(Lnodelist& L, int n) {
Lnodelist p;
p = L;
int x;
printf("请输入删除的位置:");
scanf_s("%d", &x);
for (int j = 0; j < x-1 ; j++) {
p = p->next;
}
p->next = p->next->next;
}
数据结构笔记1——单链表
于 2024-05-02 12:24:29 首次发布