这两天根据严蔚敏老师的教材学习了链表,在VS2015上运行通过.
完整代码如下:
#include "stdio.h"
#include "windows.h"
#include "string.h"
#include "stdlib.h"
typedef int ElemType;
typedef int Status;
#define MAXSIZE 100
#define OK 1;
#define ERROE 0;
//创建单链表 结构体
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//LNode *p;
//单链表初始化
Status InitList(LinkList &L)
{
L = new LNode;
L-> next= NULL;
return OK;
};
//获取单链表长度
int ListLength(LinkList L)
{
LinkList p = L; int sum = 0;
while (p)
{
sum++;
p = p->next;
}
return sum - 1;//去除头结点
}
//位置取元素
void GetElem(LinkList L)
{
int i=0,j=1;
LinkList p = L;
printf("请输入要取元素的位置 :\r\n");
scanf_s("%d", &i);
if (p->next == NULL || j > i)
printf("输入错误\r\n");
for (j=1 ; j <= i; j++)//去掉头节点
p =p->next;
printf("该位置的元素为%d\r\n", p->data);
}
//按元素查找位置
Status LocateElem(LinkList L)
{
LinkList p=L;
int data = 0, j = 0;;
printf("请输入链表中的元素:\r\n");
scanf_s("%d", &data);
while ( p->data != data )
{
j++;
p = p->next;
if (j == ListLength(L))
{
printf(" 输入错误,链表中无该元素\r\n");
return ERROR;
}
}
printf("该元素位于第%d号\r\n", j);
return OK;
}
//单链表插入
void ListInsert(LinkList &L)
{
LNode *s;
LinkList p=0;
s = new LNode;//生成新节点
p = L;//p指向第一个节点
int addr = 0, data = 0,j = 1;
printf("请输入要插入的位置:\r\n");
scanf_s("%d", &addr);
printf("请输入要插入的元素值:\r\n");
scanf_s("%d", &data);
for (int j = 1; j < addr; j++)
{
p = p->next;
}
s->data = data;
s->next = p->next;
p->next = s;
printf("插入完成\r\n");
}
//单链表删除
void ListDelete(LinkList &L)
{
int addr = 0;
LinkList s, p = L;
printf("请输入要删除节点的位置\r\n");
scanf_s("%d",&addr);
for (int j = 1; j < addr; j++)
{
p =p ->next;
}
s =p->next;
p->next = s->next;
delete s;
printf("删除完成\r\n");
}
//创建单链表(前插法 倒序)
void CreateList_H(LinkList &L)
{
int num = 0,data=0;
LinkList p;
printf(" 创建链表中元素的个数\r\n");
scanf_s("%d",&num);
printf("请创建链表\r\n");
for (int j = 0; j < num; j++)
{
p = new LNode;//生成一个新的节点或者可以用 malloc(sizeof())
scanf_s("%d",&data);
p->data = data;
p->next = L->next;
L->next = p;
}
}
//创建单链表 (后插法 正序)
void CreateList_R(LinkList &L)
{
int num = 0, data = 0;
LinkList r; //创建一个尾指针
LinkList p;
r = L;//尾指针指向头节点
printf(" 创建链表中元素的个数\r\n");
scanf_s("%d", &num);
printf("请创建链表\r\n");
for (int j = 0; j < num; j++)
{
p = new LNode;
scanf_s("%d",&data);
p->data = data;
p->next = NULL;//
r->next = p;//将新节点插入尾节点之后
r =p;//更新尾节点
}
}
//打印链表
void Printf(LinkList &L)
{
int i = 0;
LinkList p = L;
while (p->next != NULL)
{
p = p->next;
printf("%d\t",p->data);
}
printf("\r\n");
}
//菜单函数
void InitMenu()
{
printf("------菜单------\r\n");
printf("1.创建链表(前插法)\r\n");
printf("2.创建链表(尾插法)\r\n");
printf("3.查看链表\r\n");
printf("4.插入节点\r\n");
printf("5.删除节点\r\n");
printf("6.按位置查找元素\r\n");
printf("7.按元素查找位置\r\n");
printf("0.退出\r\n");
}
int main()
{
LinkList L;
int i = 0;
InitList(L);
InitMenu();
while (scanf_s("%d", &i))
{
switch (i)
{
case 1: CreateList_H(L); InitMenu(); break;// 前插法
case 2: CreateList_R(L); InitMenu(); break;//后插法
case 3: Printf(L); InitMenu(); break;//输出链表
case 4: ListInsert(L); InitMenu(); break;//插入元素
case 5: ListDelete(L); InitMenu(); break;//删除元素
case 6: GetElem(L); InitMenu(); break;//按位置取元素
case 7: LocateElem(L); InitMenu(); break;//按元素找位置
default:return 0; break;
}
}
}
运行结果如下:
前插法:
添加元素:
删除元素:
按位置查找元素:
查找元素位置: