@对单链表的各项操作
运行框
代码
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<time.h>
#define OK 1
#define ERROW -1
#define OVERFLOW -1
#define LEN sizeof(LinkNode)
#define LN LinkNode *
typedef int ElemType;
/*链表的结点的数据结构 */
typedef struct LNode
{
ElemType data; //存放元素值
struct LNode* next;//指向后继节点
}LinkNode; //单链表节点类型
/*1.链表的初始化*/
int InitList(LinkNode *& L)
{
L = (LN)malloc(LEN);
L->next = NULL; //创建头结点,其next域置为NULL
return OK;
}
/*2.创建一个链表*/
void CreateList(LinkNode *&L, int n)
{
int i;
LinkNode *p;
ElemType x;
if (L == NULL)
{
InitList(L);
}
printf("请输入获取链表的方式,1为手动输入数字创建链表,2为随机数创建链表。\n");
scanf_s("%d", &i);
if (i == 1)
{
printf("请输入%d 个数\n", n);
for (int j = 0; j < n; j++)
{
p = (LN)malloc(LEN);
scanf_s("%d", &x);
p->data = x;
p->next = L->next;
L->next = p;
}
}
/*用随机数创建链表*/
else if (i == 2)
{
for (int j = 0; j < n; j++)
{
p = (LN)malloc(LEN);
int x = rand() % 10 + 1;
p->data = x;
p->next = L->next;
L->next = p;
}
}
}
/*3.链表的清空涵数*/
void ClearList(LinkNode *& L)
{
LinkNode *p;
while (L->next)
{
p = L->next;
L->next = p->next;
free(p);
}
// 最终效果是只保留头节点
}
/*4.销毁函数*/
void DestoryList(LinkNode *& L)
{
ClearList(L);
free(L); //释放头节点空间
L = NULL;//链表的变量归于初始值,便于识别和处理
}
/*5.取表长函数*/
int GetLength(LinkNode *L)
{
int n = 0;
LinkNode *p;
p = L;
//p= (LN)malloc(LEN);
//if (L == NULL)//未经初始构建函数构建或已经彻底销毁return n;
if (L != NULL)
{
while (p->next != NULL)
{
n++;
p = p->next;
}
return (n);
}
else
{
return -1;
}
}
/*6.判断表的空否的函数 */
int IsEmpty(LinkNode *&L)
{
if (L->next == NULL)
{
return OK;
}
else
{
return ERROW;
}
}
/*7.定位取值函数*/
int GetElem(LinkNode *L, int i, ElemType& e)
{
int j = 1;
LinkNode *p;
p = L->next;
while (p && j < i)
{
p = p->next; j++;
}
if (p == NULL || j > i) //所给位置序号超出表长
{
printf("序号输入错误!\n\n");
return ERROW;
}
e = p->data;
return OK;
}
/*8.查找定位函数*/
int LocateElem(LinkNode *L, int& i, ElemType e)
{
i = 1;
LinkNode *p;
p = L->next;
while (p && p->data != e)
{
p = p->next;
i++;
}
if (p != NULL)
return OK;
else
{
return ERROW;
}
}
/*9.输出表中所有数据元素*/
void PrintList(LinkNode *L)
{
LinkNode *p0;
p0 = L->next;
printf("\n");
while (p0 != NULL)
{
printf("%d ", p0->data);
p0 = p0->next;
}
printf("\n");
}
/*10.数据元素插入函数*/
int ListInsert(LinkNode *&L, int i, ElemType e)
{
int j = 0;
LNode *p, *p0;
p = L;
while (j<i-1 && p!=NULL)
{
j++;
p = p->next;
}
if (p == NULL || j > i)
{
return ERROW;
}
else
{
p0 = (LN)malloc(LEN);
p0->data = e;
p0->next = p->next;
p->next = p0;
return OK;
}
}
/*11.定位删除函数*/
int ListDelete_1(LinkNode *& L, int i)
{
int j = 0;
LinkNode *p, *p0;
p = L;
while (p && j < i - 1)
{
p = p->next; j++;
}
if (p == NULL || j > i)
{
return ERROW;
}
p0 = p->next;
p->next = p0->next;
free(p0);
return OK;
}
/*12.非递减冒泡排序函数*/
int maopao(LinkNode *& L)
{
int i, j, t, n;
LinkNode *p, *p0;
p0 = L;
n = GetLength(L);
for (j = 1; j <= n - 1; j++)
{
p0 = p0->next;
p = p0;
for (i = 1; i <= n - j; i++)
{
if (p->data > p->next->data)
{
t = p->data;
p->data = p->next->data;
p->next->data = t;
}
p = p->next;
}
}
return OK;
}
/*打印函数*/
void menu()
{
printf("\t\t\t 单链表基本操作学习系统\n");
printf("\t\t *** 主 菜 单 ***\n\n");
printf("\t\t *1 初始化一个链表\n");
printf("\t\t *2 创建一个链表\n");
printf("\t\t *3 清空链表\n");
printf("\t\t *4 销毁链表\n");
printf("\t\t *5 打印链表长度\n");
printf("\t\t *6 判断表是否为空\n");
printf("\t\t *7 定位输出一个数据元素\n");
printf("\t\t *8 输出链表中所有元素\n");
printf("\t\t *9 定位插入一个数据元素\n");
printf("\t\t *10 定位删除一个数据元素\n");
printf("\t\t *11 定值删除一个数据元素\n");
printf("\t\t *12 对表内数据元素进行非递减排序\n");
printf("\t\t *0 结束程序\n");
}
/*主函数*/
int main()
{
int i, j, k;
LinkNode *L;
L = (LN)malloc(LEN);
L ->next= NULL;
menu();
while (1)
{
int t, l;
scanf_s("%d", &t);
if (t != 0)
if (t == 1 || GetLength(L) != -1)
{
switch (t)
{
case 1:
{
long start, end;
start = clock();
InitList(L);
end = clock();
printf("该模块运行时长为%d\n", end - start);
break;
}
case 2:
{
long start, end;
start = clock();
if (GetLength(L) != 0)
{
printf("链表已存在,是销毁并重新创建链表?\n");
printf("*1 是 *2 否\n");
scanf_s("%d", &i);
if (i == 1)
{
printf("请输入链表长度\n");
scanf_s("%d", &l);
DestoryList(L);
CreateList(L, l);
}
}
else
{
printf("请输入链表长度");
scanf_s("%d", &l);
CreateList(L, l);
}
end= clock();
printf("该模块运行时长为%d\n", end - start);
break;
}
case 3:
{
long start, end;
start = clock();
ClearList(L);
end = clock();
printf("该模块运行时长为%d\n", end - start);
break;
}
case 4:
{
long start, end;
start = clock();
DestoryList(L);
end = clock();
printf("该模块运行时长为%d\n", end - start);
break;
}
case 5:
{
long start, end;
start = clock();
GetLength(L);
end = clock();
printf("该模块运行时长为%d\n", end - start);
break;
}
case 6:
{
long start, end;
start = clock();
IsEmpty(L);
end = clock();
printf("该模块运行时长为%d\n", end - start);
break;
}
case 7:
{
long start, end;
start = clock();
k = GetLength(L);
printf("请输入数据位置\n");
scanf_s("%d", &i);
if (i<1 || i>k)
{
printf("输入位置错误\n");
}
else
{
GetElem(L, i, j);
printf("第%d 个数为%d\n", i, j);
}
end = clock();
printf("该模块运行时长为%d\n", end - start);
break;
}
case 8:
{
long start, end;
start = clock();
PrintList(L);
end = clock();
printf("该模块运行时长为%d\n", end - start);
break;
}
case 9:
{
long start, end;
start = clock();
printf("输入要插入的位置\n");
scanf_s("%d", &i);
printf("请输入要插入的数据\n");
scanf_s("%d", &j);
k = ListInsert(L, i, j);
if (k == -1)
{
printf("插入位置不合法,插入数据操作失败!\n\n");
}
else
{
printf("插入数据成功\n\n");
}
end = clock();
printf("该模块运行时长为%d\n", end - start);
break;
}
case 10:
{
long start, end;
start = clock();
printf("请输入要删除数据位置\n");
scanf_s("%d", &i);
k = ListDelete_1(L, i);
if (k == -1)
{
printf("输入位置错误,删除操作失败\n");
}
else
{
printf("删除成功!\n\n");
}
end = clock();
printf("该模块运行时长为%d\n", end - start);
break;
}
case 11:
{
long start, end;
start = clock();
printf("请输入需要删除的元素:\n");
scanf_s("%d", &j);
k = LocateElem(L, i, j);
if (k == -1)
{
printf("未找到该元素,删除操作失败!\n\n");
}
else
{
ListDelete_1(L, i);
printf("删除成功!\n\n");
}
end = clock();
printf("该模块运行时长为%d\n", end - start);
break;
}
case 12:
{
long start, end;
start = clock();
maopao(L);
printf(" 已成功排序, 返回主菜单\n");
end = clock();
printf("该模块运行时长为%d\n", end - start);
break;
}
case 0: break;
default:
{
printf("输入有误,可以重新选择,退出按 0!\n\n");
}
}
}
else
{
printf("链表未创建或已清空或销毁,请先创建链表\n\n");
system("pause");
system("CLS");
menu();
if (t == 0)
break;
}
}
return 0;
}