玩玩课本的数据结构感觉也还挺好玩的。虽然,理论性很强但是却增加了我的很多学术性的知识,感觉挺有收获的。
/*
线性表的单链表实现插入删除和查找及创建
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define ElemType int
#define Status bool
//-------线性表的单链表存储结构----------
/*
若线性表为空表,则头结点的指针为“空”
*/
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
Status GetElem_L(LinkList L,int i,ElemType &e)
{
//L带头结点的单链表的头指针
//当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
int j;
LinkList p;
p = L->next; j = 1; //初始化,p指向第一个结点,j为计数器
while(p&&j < i){
p = p->next; ++j;
}
if(!p||j>i)
return false;
e = p->data;
return true;
} //GetElem_L
Status ListInsert_L(LinkList &L,int i,ElemType e)
{
//带头结点的单链表线性表L中第i个位置之前插入元素e
int j;
LinkList p,s;
p = L->next; j = 1;
while(p&&j < i){ //寻找i-1个结点
p = p->next;
++j;
}
if(!p||j>i)
return false;
s = (LinkList)malloc(sizeof(LNode)); //生成新结点
/* 注意赋值的前后顺序 */
s->data = e; s->next = p->next; //插入L中
p->next = s;
return true;
}
Status ListDelete_L(LinkList &L,int i,ElemType &e){
//带头结点的单链表线性表L中,删除第i个元素,并由e返回其值
int j;
LinkList p,q;
p = L; j = 1;
/*
注意判断条件是 p->next 提前判断条件是否满足
因为,要删除第i个则要先从第i-1个的Next得到
所以,如果第i-1个Next为空说明第i个已经超出
数据范围了。
*/
while(p->next&&j < i){ //寻找第i个结点,并令p指向其前驱
p = p->next;
++j;
}
if(!(p->next)||j > i) // 删除位置不合理
return false;
q = p->next; p->next = q->next; //删除并释放结点
e = q->data; free(q);
return true;
}// ListDelete_L
void CreateList_L(LinkList &L,int n)
{
//逆位序输入n个元素的值,建立带头结点的单链线性表L
LinkList p;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL; //先建立一个带头结点的单链表
for(int i = n;i > 0;--i){
p = (LinkList)malloc(sizeof(LNode)); //生成新结点
scanf("%d",&p->data);
p->next = L->next; L->next = p; // 插入到表头
}
} //CreateList_L
int main()
{
int n,pos,e;
LinkList L,p;
printf("Please enter you want to how many number: ");
scanf("%d",&n);
CreateList_L(L,n);
puts("You enter number is: ");
p = L->next;
while(p){
printf("%d ",p->data);
p = p->next;
}
puts("");
//输入你要删除元素的位置
printf("Please input you want to delete number position: ");
scanf("%d",&pos);
if(ListDelete_L(L,pos,e)){
printf("You Delete number is: %d\n",e);
puts("Delete After:");
p = L->next;
while(p){
printf("%d ",p->data);
p = p->next;
}
puts("");
}
else{
printf("Sorry!Delete error!");
}
//输入你要插入元素的位置和元素值
printf("Please input you want to insert position and number value: ");
scanf("%d%d",&pos,&e);
if(ListInsert_L(L,pos,e)){
printf("Insert successful!");
puts("Insert After:");
p = L->next;
while(p){
printf("%d ",p->data);
p = p->next;
}
puts("");
}
else{
printf("Insert Error!");
}
//输入你要获得的元素位置
printf("Please input you want to get number position: ");
scanf("%d",&pos);
if(GetElem_L(L,pos,e)){
printf("You want to get number is: %d\n",e);
}
else{
printf("Sorry get number Error!");
}
return 0;
}