上上次上机课花差不多两个小时才搞定的,经测试可行,虽然有点粗糙。。。。
/*by Wadye*/
#include <iostream>
#include <cstdio>
#include <cstring>
#define Elemtype int
using namespace std;
typedef enum { ERROR, OK } Status;
//单链表的储存结构
typedef struct LNode
{
Elemtype data; //结点的数据域
struct LNode *next; //结点的指针域
} LNode,*LinkList; //LinkList为指向结构体LNode的指针类型
//单链表的初始化
Status InitList_L(LinkList &L)
{
//构造一个空的单链表L
L = new LNode; //生成新结点作为头结点,用头指针L指向头结点
L->next = NULL; //头结点的指针域置空
return OK;
}
//按序号查找
Status GetElem_L(LinkList L, int i)
{
//在带头结点的单链表L中查找第i个元素
int e, j;
LinkList p;
p = L->next; //初始化,p指向第一个结点,j为计数器
j = 1;
while(p && j < i) //顺链向后扫描,知道o指向第i个元素或为空
{
p = p -> next;
j++;
}
if(!p || j > i)return ERROR; //第i个元素不存在
e = p -> data; //取第i个元素
printf("%d\n",e);
return OK;
}
//按值查找
LNode *LocateElem_L(LinkList L, Elemtype e)
{
//在带头结点的单链表L中查找值为e的元素
LinkList p;
p = L -> next;
while(p && p -> data != e)
p = p -> next; //寻找满足条件的结点
//printf("%d\n",p);
return p; //返回L中值为e的数据元素位置,查找失败返回NULL
}
//插入
Status ListInsert_L(LinkList &L, int i, Elemtype e)
{
//在带头结点的单链表L中第i个位置之前插入元素e
LinkList p;
LinkList ss;
LinkList s;
int j;
p = L;
j = 0;
while(p && j < i-1) //寻找第i-1个结点
{
p = p -> next;
j++;
}
if(!p || j > i-1)return ERROR; //i大于表长+1或者小于1
s = new LNode; //生成新结点
s-> data = e; //将结点s的数据域置为e
s -> next = p -> next; //将结点s插入L
p -> next = s;
p = L ;
for(int i = 0; p->next->next!=NULL; i++)
{
p = p -> next;
printf("%d->",p->data);
}
printf("%d",p->next->data);
printf("\n");
return OK;
}
//删除
Status ListDelete_L(LinkList &L, int i)
{
//在带头结点的单链表L中,删除第i个元素,并由e返回其值
LinkList p;
LinkList q;
int e;
int j;
p = L;
j = 0;
while(p -> next && j < i-1) //寻找第i-1个结点
{
p = p -> next;
j++;
}
if(!p -> next || j > i-1)return ERROR; //i大于表长+1或者小于1
q = p -> next; //临时保存被删结点的地址以备释放
p -> next = q -> next; //改变删除结点前驱结点的指针域
e = q -> data; //保存删除结点的数据域
delete q; //释放删除结点的空间
p = L ;
for(int i = 0; p->next->next!=NULL; i++)
{
p = p -> next;
printf("%d->",p->data);
}
printf("%d",p->next->data);
printf("\n");
return OK;
}
//前插法创建单链表
void CreateList_F(LinkList &L, int n)
{
LinkList p;
L = new LNode;
L -> next = NULL; //建立一个带头结点的空链表
for(int i = n; i > 0; i--)
{
p = new LNode; //生成新结点
cin >> p -> data; //输入元素值
p -> next = L -> next;
L -> next = p; //插入到表头
}
p = L ;
for(int i = 0; p->next->next!=NULL; i++)
{
p = p -> next;
printf("%d->",p->data);
}
printf("%d",p->next->data);
printf("\n");
}
//后插法创建单链表
void CreateList_L(LinkList &L, int n)
{
LinkList r;
LinkList p;
L = new LNode;
L -> next = NULL; //建立一个带头结点的空链表
r = L; //尾针r指向头结点
for(int i = 0; i < n; i++)
{
p = new LNode; //生成新结点
cin >> p -> data; //输入元素值
p -> next = NULL;
r -> next = p; //插入到表尾
r = p; //r指向新的尾结点
}
p = L ;
for(int i = 0; p->next->next!=NULL; i++)
{
p = p -> next;
printf("%d->",p->data);
}
printf("%d",p->next->data);
printf("\n");
}
//菜单
void menue()
{
printf("1.前插法创建单链表\n");
printf("2.后插法创建单链表\n");
printf("3.插入\n");
printf("4.删除\n");
printf("5.按序号查找\n");
printf("6.按值查找\n");
}
int main()
{
int sele;
LinkList l;
int n, e, i;
menue();
while(cin >> sele)
{
switch(sele)
{
case 1:
printf("请输入链表的长度:");
cin >> n;
printf("\n");
CreateList_F(l, n);
break;
case 2:
printf("请输入链表的长度:");
cin >> n;
printf("\n");
CreateList_L(l, n);
break;
case 3:
printf("请输入要插入的元素:");
cin >> e;
printf("\n");
printf("请输入要插入的位置:");
cin >> i;
printf("\n");
ListInsert_L(l, i, e);
break;
case 4:
printf("请输入要删除的位置:");
cin >> i;
printf("\n");
ListDelete_L(l, i);
break;
case 5:
printf("请输入要查找的元素位置:");
cin >> i;
GetElem_L(l, i);
case 6:
printf("请输入要查找的元素:");
cin >> e;
LocateElem_L(l, e);
break;
}
}
}