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;
}
posted @ 2023-03-19 14:53  noobwei  阅读(13)  评论(0编辑  收藏  举报