20230319
数据结构remake第二天
静态链表
可以理解为没有指针的编程语言的替代方案,增加cur作为p->next
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 10
typedef int ElemType;
typedef struct Node {
ElemType data;
int cur;
}SLinkList[MAXSIZE];
int MallocSLinkList(SLinkList&space){
int i=space[0].cur;
if(space[0].cur){
space[0].cur=space[i].cur;
}
return i;
}
void InitSLinkList(SLinkList&space,ElemType&headNode){
for(int i=0;i<MAXSIZE-1;i++){
space[i].cur=i+1;
}
space[MAXSIZE-1].cur=0;
headNode=MallocSLinkList(space);
}
void FreeSLinkList(SLinkList&space,int k){
space[k].cur=space[0].cur;
space[0].cur=k;
}
int CreateList(SLinkList&space,ElemType e,int j){
int k=j;
int r=MallocSLinkList(space);
space[r].data=e;
space[k].cur=r;
k=r;
space[k].cur=0;
printf("插入节点成功!\n");
return k;
}
int FindNode(SLinkList&space,int i,int headNode){
if(i<1||i>MAXSIZE){
printf("插入位置不合法!\n");
return -1;
}
int k=headNode;
int j=0;
while(k!=0&&j<i-1){
j++;
k=space[k].cur;
}
return k;
}
void InsertNode(SLinkList&space,int headNode,int i,ElemType e){
int k=FindNode(space,i,headNode);
if(k==0)return;
int m=MallocSLinkList(space);
if(m!=0){
space[m].data=e;
space[m].cur=space[k].cur;
space[k].cur=m;
printf("插入节点成功!\n");
return ;
}else{
printf("插入节点失败!\n");
return ;
}
}
void DeleteNode(SLinkList&space,int headNode,int i,ElemType&e){
int k=FindNode(space,i,headNode);
if(k==0)return;
int m=space[k].cur;
space[k].cur=space[m].cur;
e=space[m].data;
FreeSLinkList(space,m);
printf("删除节点成功!\n");
return ;
}
int LocateElem(SLinkList space,ElemType e,int headNode){
int i=space[headNode].cur;
while(i&&space[i].data!=e){
i=space[i].cur;
}
return i;
}
void PrintSLinkListNode(SLinkList space,int headNode){
int i=space[headNode].cur;
while(i!=0){
printf("%d\t",space[i].data);
i=space[i].cur;
}
printf("\n");
}
int main(){
SLinkList space;
int i;
int j;
ElemType e;
ElemType headNode;
InitSLinkList(space,headNode);
j=headNode;
while(1){
int flag=0;
printf("请输入操作: \n");
printf("1 初始化\n2 按顺序插入元素\n3 在具体位置插入元素\n4 删除具体节点元素\n5 输出\n");
scanf("%d",&flag);
switch(flag){
case 1:
InitSLinkList(space,headNode);
printf("初始化成功!\n");
break;
case 2:
printf("请输入元素(-1_end): ");
scanf("%d",&e);
while(e!=-1){
j=CreateList(space,e,j);
printf("请输入元素(-1_end): ");
scanf("%d",&e);
}
break;
case 3:
printf("请输入插入的位置: ");
scanf("%d",&i);
printf("请输入插入的值: ");
scanf("%d",&e);
InsertNode(space,headNode,i,e);
break;
case 4:
printf("请输入删除的节点位置: ");
scanf("%d",&i);
DeleteNode(space,headNode,i,e);
printf("删除的节点 = %d\n",e);
break;
case 5:
PrintSLinkListNode(space,headNode);
break;
default:
printf("结束操作\n");
}
if(flag==6){
break;
}
}
return 0;
}