头插法和尾插法
头插法:
尾插法:
代码实现:
注释部分为头插法
#include<stdio.h>
#include<stdlib.h> //malloc的头文件
#include<time.h>
typedef struct Node
{
int data; //数据域
struct Node* Next; //指针域 指向下一个节点的指针
}Node;
/*
//头插法
Node* CreateListHead(int len) //创建
{
Node* head; //头节点
Node* p;
int i;
srand(time(0)); //初始化随机种子
head = (Node*)malloc(sizeof(Node)); //给头节点创建临时空间
head->Next = NULL;
for (i = 0; i < len; i++)
{
p = (Node*)malloc(sizeof(Node));
p->data = rand() % 100 + 1; //生成100以内的随机数
//头插法插入链表
p->Next = head->Next; // p节点的指针指向head节点指向的位置
head->Next = p; //head节点的指针指向p节点
}
return head;
}
*/
//尾插法
Node* CreateListTail(int len)
{
Node* head; //头节点
Node* Tail; //尾节点
Node* p; //p节点 临时存放需要写入的数据
int i;
//srand(time(0)); //初始化随机种子
head = Tail = (Node*)malloc(sizeof(Node)); //链表为空时 头节点=尾节点
head->Next = NULL;
for (i = 0; i < len; i++)
{
p = (Node*)malloc(sizeof(Node));
p->data = rand() % 100 + 1;
//尾插法插入链表
Tail->Next = p; //将p节点的数字写入链表末尾(此时,p节点为链表的尾节点)
Tail = p; //将尾节点替换为Tail
}
Tail->Next = NULL; //插入完成后,尾节点指向NULL
return head;
}
int main()
{
Node* L;
Node* p;
int len ; //链表长度
printf("请写出链表的长度 len:");
scanf_s("%d", &len);
//L = CreateListHead(len);
L = CreateListTail(len);
//L = Creat(len);
p = L->Next; //将第一个乱码数据跳过
while (p != NULL)
{
printf("%d ", p->data);
p = p->Next;
}
printf("\n");
free(L);
free(p);
system("pause");
return 0;
}
快速找到单链表的中间节点
代码实现:
注释部分为头插法
//快速找到单链表的中间节点实例
#include<stdio.h>
#include<stdlib.h> //malloc的头文件
#include<time.h>
#define ERROR 0;
#define OK 1;
typedef struct Node
{
int data; //数据域
struct Node* Next; //指针域 指向下一个节点的指针
}Node;
/*
//头插法
Node* CreateListHead(int len)
{
Node* head; //定义一个指向头节点的指针
Node* p;
int i;
srand(time(0)); //初始化随机数
head = (Node*)malloc(sizeof(Node)); //创建临时空间
head->Next = NULL;
for (i = 0; i < len; i++)
{
p = (Node*)malloc(sizeof(Node));
p->data = rand() % 100 + 1; //生成100以内的随机数
p->Next = head->Next; //p节点的指针 指向 head节点所指的地址
head->Next = p; //head节点的指针指向p
}
return head;
}
*/
//尾插法
Node* CreateListTail(int len)
{
Node* head;
Node* tail;
Node* p;
int i;
srand(time(0));
head = tail = (Node*)malloc(sizeof(Node));
head->Next = NULL;
for (i = 0; i < len; i++)
{
p = (Node*)malloc(sizeof(Node));
p->data = rand() % 100 + 1;
tail->Next = p;//将p节点的数字写入链表末尾(此时,p节点为链表的尾节点)
tail = p;//将尾节点替换为Tail
}
tail->Next = NULL; //插入完成后,尾节点指向NULL
return head;
}
//寻找中间节点//
int GetMidNode(Node* head, int* e)
{
Node* search = head;
Node* mid = head;
while (search->Next != NULL)
{
if (search->Next->Next != NULL)
{
search = search->Next->Next; //search指向 search的下一个节点的 下一个节点
mid = mid->Next;
} // search指向链表最后时,mid刚好指向中间
else //要插入的链表为奇数时使用
{
search = search->Next;
mid = mid->Next;
}
}
*e = mid->data;
return OK;
}
int main()
{
Node* L;
Node* P;
int len = 0;
int e;
printf("请输入线性表L的长度 len:");
scanf_s("%d", &len);
//L = CreateListHead(len); //头插法使用
L = CreateListTail(len);
P = (Node*)malloc(sizeof(Node)); //创建临时空间(堆中)
P = L->Next;
while (P != NULL)
{
printf("%d ", P->data);
P = P->Next;
}
GetMidNode(L, &e); //寻找中间节点
printf("\n中间节点为:%d\n", e);
free(L); //释放空间
free(P);
system("pause");
return 0;
}