/*************************************
*单链表 功能:
* 1 查看单链表
* 2 单链表的长度
* 3 删除第i个元素
* 4 从第i个元素后插入数据e(e为整型)
* 5 查找中间元素
* 6 退出
**************************************/
#include <stdio.h>
#include <stdlib.h>//调用srand()
#include <time.h>//调用time()
//定义单链表结构
typedef int Datatype;
struct Node{
Datatype data;
struct Node* next;
}Node;
typedef struct Node * LinkList;
/**
* 功能:尾插发创建单链表
* 参数:单链表的地址指针 LinkList *L 单链表的长度 int n
* 返回值:返回操作是否成功
*/
void CreateLinkList (LinkList *L, int n){
LinkList p, r;
int i;
//初始化随机种子
srand(time(0));
(*L) = (LinkList)malloc(sizeof(Node));
r = (*L);
for( i = 1; i <= n; ++i){
p = (LinkList)malloc(sizeof(Node));
p -> data = rand()%100+1;
r-> next = p;
r = p;
}
r -> next = NULL;
}
/**
* 功能:获取单链表的长度
* 参数:单链表的地址指针 LinkList *L
* 返回值:单链表的长度
*/
int LinkListLength(LinkList L){
int length = 0;
LinkList p;
p = L -> next;
while(p != NULL)
{
p = p -> next;
++length;
}
return length;
}
/**
* 功能:获取单链表的第i个元素
* 参数:单链表的地址指针 LinkList L 单链表的第i个元素 int i
* 返回值:第i个元素的值
*/
Datatype GetElem(LinkList L, int i){
Datatype e;
int j;
LinkList p;
p = L -> next;
j = 1;
while(p && j <i)
{
p = p -> next;
++j;
}
e = p -> data;
return e;
}
//功能1
void ScanElem(LinkList L){
int i;
for(i = 1; i <= LinkListLength(L); ++i)
{
printf("%d ",GetElem(L, i));
}
printf("\n");
}
/**
* 功能:删除单链表的第i个元素
* 参数:单链表的地址指针 LinkList L 单链表的第i个元素 int i
* 返回值:无
*/
void DeleteLinkList(LinkList L, int i){
LinkList p, q;
int j;
Datatype e;
p = L;
j = 1;
if( i < 1 || i > LinkListLength(L))
{
printf("请输入1-20的数!\n");
}else{
while( j <i)
{
p = p -> next;
++j;
}
q = p -> next;
p -> next = q -> next;
e = q -> data;
free(q);
}
}
/**
* 功能:从第i个元素开始插入数据到单链表
* 参数:单链表的地址指针 LinkList L 单链表的第i个元素 int i 插入的数据 Datatype e
* 返回值:无
*/
void LinkListInsert(LinkList L, int i, Datatype e){
LinkList p, q;
int j;
p = L;
j = 1;
if( i < 1 || i > LinkListLength(L))
{
printf("请输入1-20的数!\n");
}else{
while( j < i + 1)
{
p = p -> next;
++j;
}
//向系统申请分配指定size个字节的内存空间
q = (LinkList)malloc(sizeof(Node));
q -> data = e;
q -> next = p -> next;
p -> next = q;
}
}
/**
* 功能:快速找到未知长度单链表的中间节点(快慢指针)
* 参数:单链表的地址指针 LinkList L
* 返回值:Datatype 中间元素的值
*/
Datatype GetMidNode (LinkList L)
{
Datatype e;
LinkList search, mid;
mid = search = L;
while (search -> next != NULL)
{
//search移动的速度是mid的两倍
if (search -> next -> next != NULL)
{
search = search -> next -> next;
mid = mid -> next;
}
else
{
search = search -> next;
}
}
e = mid -> data;
return e;
}
//提示
void Tip(){
printf("选择功能:\n");
printf("1 查看单链表\n");
printf("2 单链表的长度\n");
printf("3 删除第i个元素\n");
printf("4 从第i个元素后插入数据e(e为整型)\n");
printf("5 查找中间元素:\n");
printf("6 退出\n");
}
int main(){
LinkList L;
int x, i, e;
//初始化单链表
CreateLinkList(&L, 20);
//提示
Tip();
scanf("%d", &x);
while( x != 6){
switch(x){
case 1:
ScanElem(L); break;
case 2:
printf("%d\n",LinkListLength(L));break;
case 3:
printf("请输入i\n");
scanf("%d", &i);
DeleteLinkList(L, i);break;
case 4:
printf("请输入i 和元素e\n");
scanf("%d", &i);
scanf("%d", &e);
LinkListInsert(L, i, e);break;
case 5:
printf("%d\n",GetMidNode (L));break;
default:
printf("请输入1-6的数字!\n");
}
scanf("%d", &x);
}
system("pause");
return 0;
}
单链表及相关操作
最新推荐文章于 2020-01-09 14:40:13 发布