#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef int ElemType;
//定义节点类型
typedef struct Node //typedef使定义一个对象名变为定义一个类型名
//E.G.这里的Node,*LinkedList本来是struct Node的对象,加了typedef就变成了类型名
{
ElemType data; //单链表中的数据域
struct Node *next; //单链表中的指针域
}Node, *LinkedList;
//单链表的初始化
LinkedList LinkedListInit()
{
Node *L;
L = (Node*)malloc(sizeof(Node)); //申请节点空间
if (L == NULL) //判断是否有足够的内存空间
printf("申请内存空间失败\n");
L->next = NULL; //将next设置为NULL,初始长度为0的单链表
return L;
}
//单链表的建立,头插法建立单链表
LinkedList LinkedListCreateHead()
{
Node* L;
L = (Node*)malloc(sizeof(Node)); //申请头结点空间
L->next = NULL; //初始化一个空链表
ElemType x;
while (scanf_s("%d", &x) != EOF)
{
Node *p;
p = (Node*)malloc(sizeof(Node)); //申请新的结点
p->data = x; //结点数据域赋值
p->next = L->next; //p指向的结点中的next指针指向L指向的头结点中next指针指向的位置,p取代了L
L->next = p; // L指向的结点中的next指针p指向的结点,头结点指向p指向的结点
}
return L;
}
//单链表的建立,尾插法建立单链表
LinkedList LinkedListCreateBehind()
{
Node* L;
L = (Node*)malloc(sizeof(Node)); //申请头结点空间
L->next = NULL; //初始化一个空链表
Node* r;
r = L; //r始终指向终端结点,开始时指向头结点
ElemType x; //x为链表数据域中的数据
while (scanf_s("%d", &x) != EOF)
{
Node *p;
p = (Node*)malloc(sizeof(Node)); //申请新的结点
p->data = x; //结点数据域赋值
r->next = p; // r指向p指向的结点
r = p;
}
r->next = NULL;
return L;
}
//单链表的插入,在链表的第i个位置插入x的元素
LinkedList LinkedListInsert(LinkedList L, int i, ElemType x)
{
Node *pre; //pre为前驱结点
pre = L;
int tempi = 0;
for (tempi = 1; tempi < i; tempi++)
{
pre = pre->next;
}
Node *p; //插入的结点为P
p = (Node*)malloc(sizeof(Node)); // 为p申请一个结点空间
p->data = x; //将x给p结点中data
p->next = pre->next; //p取代pre指向目标位置
pre->next = p;
return L; //返回链表
}
//单链表的删除,在链表中删除值为x的元素
LinkedList LinkedListDelete(LinkedList L, ElemType x)
{
Node *p, *pre; //p为要查找的元素,pre为前驱结点
p = L; //L指向头结点
pre = NULL;
//用p,pre两个指针去取代链表中的指针,进行一些操作来删除元素
while (p->data != x) //查找数据为x的结点
{
pre=p;
p = p->next; //找不到x就把p给pre,然后p指向下一个,然后看下一个p是不是x
}
pre->next = p->next;
// 这行是关键。找到了p,就将p的下一个结点给pre,这样就跳过了x
free(p); //将x的空间释放
return L;
}
int main()
{
LinkedList list, start;
printf("请输入单链表的数据: ");
list = LinkedListCreateBehind();
for (start = list->next; start != NULL; start = start->next)
{
printf("%d", start->data); //输出链表list
printf(" ");
}
printf("\n");
int i;
ElemType x;
printf("请输入插入数据的位置: ");
scanf_s("%d", &i);
printf("请输入插入数据的值: ");
scanf_s("%d", &x);
LinkedListInsert(list, i, x); //在链表list的第i个位置插入数据为x的结点
for (start = list->next; start != NULL; start = start->next)
{
printf("%d", start->data); //输出链表list
printf(" ");
}
printf("\n");
printf("请输入要删除元素的值: ");
scanf_s("%d", &x);
LinkedListDelete(list, x); //删除数据为x的结点
for (start = list->next; start != NULL; start = start->next)
{
printf("%d", start->data); //输出链表list
printf(" ");
}
printf("\n");
system("pause");
return 0;
}