数据结构---线性顺序表+单链表+静态链表完整C代码(最易懂代码)

前言:

本篇博客适合那些已经接触过数据结构并了解过链表的知识。对于那些还没入门的小伙伴来说,这篇博客不适合阅读。我们在学习这节知识时,书上给出的代码都是一片段的,没有最终给出完整可以运行的代码,本篇博客就特意写出了完整代码,希望大家能够在阅读本篇博客后,收获很多,当然,如果有写的不好的地方,希望大家给出意见或批评。

顺序表完整代码

//顺序表完整代码
#include<time.h>
#include<windows.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#define MAXSIZE 20
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct ListNode{
    ElemType data[MAXSIZE];
    int length;
}*LNode;
//初始化操作
Status InitLNode(){
    LNode L;
    L=(LNode)malloc(sizeof(struct ListNode));
    L->length=0;
    return L;
}
//返回长度
Status Len_LNode(LNode L){
    printf("顺序表的长度为:%d\n",L->length);
    return OK;
}
//输入操作
void Input_LNode(LNode L){
    printf("请输入元素的总个数:");
    int n;
    scanf("%d",&n);
    printf("请输入各个元素:\n");
    for(int i=0;i<n;i++){
        scanf("%d",&L->data[i]);
    }
    L->length=n;
    printf("录入成功\n");
}
//输出操作
void Output_LNode(LNode L){
    for(int i=0;i<L->length;i++){
        printf("%d ",L->data[i]);
    }
    printf("\n");
    printf("输出完毕\n");
}
//获取指定元素操作
Status GetElem(LNode L,int i,ElemType *e){
    if(i<1||i>L->length||L->length==0){
        printf("获取元素失败\n");
        return ERROR;
    }
    *e=L->data[i-1];
    printf("获取的元素为:%d\n",*e);
    return OK;
}
//插入操作
Status Insert_LNode(LNode L,int i,ElemType e){
    if(L->length==MAXSIZE||i<1||i>L->length){
        printf("插入失败\n");
        return ERROR;
    }
    int k;
    for(k=L->length-1;k>=i-1;k--){
        L->data[k+1]=L->data[k];
    }
    L->data[i-1]=e;
    L->length++;
    printf("插入成功\n");
    return OK;
}
//删除操作
Status Delete_LNode(LNode L,int i,ElemType *e){
    if(L->length==0||i<1||i>L->length){
        printf("删除失败\n");
        return ERROR;
    }
    int k;
    *e=L->data[i-1];
    for(k=i-1;k<L->length-1;k++){
        L->data[k]=L->data[k+1];
    }
    L->length--;
    printf("删除成功\n");
    return OK;
}
//销毁顺序表
void Destroy_LNode(LNode L){
    L->length=0;
    printf("销毁成功\n");
}
int main(){
    LNode L;
    L=InitLNode();
    int choice=0;
    while(choice!=8){
        printf("**********菜单**********\n");
        printf("|1.输入元素   2.输出顺序表的元素|\n");
        printf("|3.插入操作   4.删除操作|\n");
        printf("|5.获取元素操作   6.销毁顺序表|\n");
        printf("|7.返回顺序表长度   8.退出程序|\n");
        printf("请输入你的选择:");
        scanf("%d",&choice);
        switch(choice){
            case 1 :
                Input_LNode(L);
                printf("程序将自动跳转到菜单栏\n");
                Sleep(1000);
                system("cls");
                break;
            case 2 :
                Output_LNode(L);
                printf("程序将自动跳转到菜单栏\n");
                Sleep(1000);
                system("cls");
                break;
            case 3 :
                {
                int i;
                int e;
                printf("请输入你要在第几个元素前面插入一个元素:");
                scanf("%d",&i);
                printf("请输入插入的元素值:");
                scanf("%d",&e);
                Insert_LNode(L,i,e);
                printf("程序将自动跳转到菜单栏\n");
                Sleep(1000);
                system("cls");
                break;
                }
            case 4 :
                {
                int i;
                ElemType e;
                printf("请输入你要删除第几个元素:");
                scanf("%d",&i);
                Delete_LNode(L,i,&e);
                printf("程序将自动跳转到菜单栏\n");
                Sleep(1000);
                system("cls");
                }
            case 5 :
                {
                int i;
                ElemType e;
                printf("请输入你要获取第几个元素:");
                scanf("%d",&i);
                GetElem(L,i,&e);
                printf("程序将自动跳转到菜单栏\n");
                Sleep(1000);
                system("cls");
                break;
                }
            case 6 :
                Destroy_LNode(L);
                printf("程序将自动跳转到菜单栏\n");
                Sleep(1000);
                system("cls");
                break;
            case 7 :
                Len_LNode(L);
                break;
            case 8 :
                system("cls");
                printf("程序退出\n");
                break;
        }
    }
    return 0;
}

单链表完整代码

//单链表完整代码
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct Node{
    ElemType *data;
    struct Node *next;
}Node;
typedef struct Node* LinkList;
//获取元素操作
Status GetElem(LinkList *L,int i,ElemType *e){
    int j=1;
    LinkList p;
    p=(*L)->next;
    while(j<i&&p){
        p=p->next;
        j++;
    }
    if(!p||j>i){
        printf("指定元素不存在\n");
        return ERROR;
    }
    *e=p->data;
    printf("获取成功!\n元素值为:%d\n",*e);
    return OK;
}
//插入操作
Status InsertList(LinkList *L,int i,ElemType e){
    int j;
    j=1;
    LinkList p,s;
    p=*L;
    while(p&&j<i){
        p=p->next;
        j++;
    }
    if(j>i||!p){
        printf("输入有误,插入失败!\n");
        return ERROR;
    }
    s=(LinkList)malloc(sizeof(Node));
    s->data=e;
    s->next=p->next;
    p->next=s;
    printf("插入成功!\n");
    return OK;
}
//删除操作
Status DeleteList(LinkList *L,int i,ElemType *e){
    int j;
    j=1;
    LinkList p,s;
    p=*L;
    while(j<i&&p){
        p=p->next;
        j++;
    }
    if(j>i||!p){
        printf("输入有误,删除失败!");
        return ERROR;
    }
    s=p->next;
    *e=s->data;
    p->next=s->next;
    free(s);
    printf("删除成功!\n");
    return OK;
}
//头插法
void CreateListHead(LinkList *L,int n){
    LinkList p;
    int i;
    srand(time(0));
    *L=(LinkList)malloc(sizeof(Node));
    (*L)->next=NULL;
    for(i=0;i<n;i++){
        p=(LinkList)malloc(sizeof(Node));
        p->data=rand()%100+1;
        p->next=(*L)->next;
        (*L)->next=p;
    }
    printf("程序录入成功!\n");
}
//尾插法
void CreateListTail(LinkList *L,int n){
    LinkList p,r;
    int i;
    srand(time(0));
    *L=(LinkList)malloc(sizeof(Node));
    r=*L;
    for(i=0;i<n;i++){
        p=(LinkList)malloc(sizeof(Node));
        p->data=rand()%100+1;
        r->next=p;
        r=p;
    }
    r->next=NULL;
    printf("程序录入成功!\n");
}
//输出操作
void Output_List(LinkList *L){
    LinkList p;
    p=(*L)->next;
    if(!p){
        printf("表中无任何元素!\n");
    }
    else{
        while(p){
            printf("%d ",p->data);
            p=p->next;
        }
    }
    printf("\n输出完毕!\n");
}
//输入操作(头插法)
void Input_ListHead(LinkList *L){
    int n;
    LinkList p;
    *L=(LinkList)malloc(sizeof(Node));
    (*L)->next=NULL;
    printf("请输入元素的总个数:");
    scanf("%d",&n);
    printf("请输入各个元素的值:\n");
    for(int i=0;i<n;i++){
        p=(LinkList)malloc(sizeof(Node));
        scanf("%d",&p->data);
        p->next=(*L)->next;
        (*L)->next=p;
    }
    printf("程序录入成功!\n");
}
//输入操作(尾插法)
void Input_ListTail(LinkList *L){
    int n;
    LinkList p,r;
    *L=(LinkList)malloc(sizeof(Node));
    r=*L;
    printf("请输入元素的总个数:");
    scanf("%d",&n);
    printf("请输入各个元素的值:\n");
    for(int i=0;i<n;i++){
        p=(LinkList)malloc(sizeof(Node));
        scanf("%d",&p->data);
        r->next=p;
        r=p;
    }
    r->next=NULL;
    printf("程序录入成功!\n");
}
//初始化操作
LinkList Init_List(){
    LinkList L;
    L=(LinkList)malloc(sizeof(Node));
    L->next=NULL;
    return L;
}
int main(){
    LinkList L;
    L=Init_List();
    int choice=0;
    while(choice!=9){
        printf("**********菜单**********\n");
        printf("|1.头插法录入数据  2.尾插法录入数据|\n");
        printf("|3.删除元素   4.插入元素|\n");
        printf("|5.键盘输入元素(头插法)   6.输出元素|\n");
        printf("|7.获取指定元素   8.键盘输入元素(尾插法)|\n");
        printf("|9.退出程序|\n");
        printf("请输入你的选择:");
        scanf("%d",&choice);
        switch(choice){
            case 1: {
                int n;
                printf("请输入元素的总个数:");
                scanf("%d",&n);
                CreateListHead(&L,n);
                printf("程序将自动跳转到菜单页面\n");
                Sleep(1000);
                system("cls");
                break;
            }
            case 2:{
                int n;
                printf("请输入元素的总个数:");
                scanf("%d",&n);
                CreateListTail(&L,n);
                printf("程序将自动跳转到菜单页面\n");
                Sleep(1000);
                system("cls");
                break;
            }
            case 3:{
                ElemType e;
                int i;
                printf("请输入你要删除第几个元素:");
                scanf("%d",&i);
                DeleteList(&L,i,&e);
                printf("程序将自动跳转到菜单页面\n");
                Sleep(1000);
                system("cls");
                break;
            }
            case 4:{
                ElemType e;
                int i;
                printf("请输入你要在第几元素前插入元素:");
                scanf("%d",&i);
                printf("请输入你要插入元素的值:");
                scanf("%d",&e);
                InsertList(&L,i,e);
                printf("程序将自动跳转到菜单页面\n");
                Sleep(1000);
                system("cls");
                break;
            }
            case 5:{
                Input_ListHead(&L);
                printf("程序将自动跳转到菜单页面\n");
                Sleep(1000);
                system("cls");
                break;
            }
            case 6:{
                Output_List(&L);
                printf("程序将自动跳转到菜单页面\n");
                Sleep(1000);
                system("cls");
                break;
            }
            case 7:{
                int i;
                ElemType e;
                printf("请输入你想获取第几个元素:");
                scanf("%d",&i);
                GetElem(&L,i,&e);
                printf("程序将自动跳转到菜单页面\n");
                Sleep(1000);
                system("cls");
                break;
            }
            case 8:{
                Input_ListTail(&L);
                printf("程序将自动跳转到菜单页面\n");
                Sleep(1000);
                system("cls");
                break;
            }
        }
    }
    return 0;
}

静态链表完整代码

//静态链表代码
#include<time.h>
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 200
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct{
    ElemType data;
    int cur;
}Component,StaticLinkList[MAXSIZE];
//初始化操作
void InitList(StaticLinkList space){
    for(int i=0;i<MAXSIZE-1;i++){
        space[i].cur=i+1;
    }
    space[MAXSIZE-1].cur=0;
}
//获取空闲分量
int Malloc_SLL(StaticLinkList space){
    int i=space[0].cur;
    if(space[0].cur){
        space[0].cur=space[i].cur;
    }
    return i;
}
//插入操作
Status ListInsert(StaticLinkList L,int i,ElemType e){
    int j,k,l;
    k=MAXSIZE-1;
    if(i<1||i>ListLength(L)+1){
        return ERROR;
        printf("插入失败\n");
    }
    j=Malloc_SLL(L);
    if(j){
        for(l=1;l<=i-1;l++){
            k=L[k].cur;
        }
        L[j].data=e;
        L[j].cur=L[k].cur;
        L[k].cur=j;
    }
    printf("插入成功\n");
    return OK;
}
//删除操作
Status ListDelete(StaticLinkList L,int i){
    int j,k;
    if(i<1||i>ListLength(L)){
        return ERROR;
        printf("删除失败\n");
    }
    k=MAXSIZE-1;
    for(j=1;j<=i-1;j++){
        k=L[k].cur;
    }
    j=L[k].cur;
    L[k].cur=L[j].cur;
    Free_SLL(L,j);
    printf("删除成功\n");
    return OK;
}
//将待删除元素放置于备用处
void Free_SLL(StaticLinkList space ,int k){
    space[k].cur=space[0].cur;
    space[0].cur=k;
}
//获取表长
int ListLength(StaticLinkList L){
    int j=0;
    int i=L[MAXSIZE-1].cur;
    while(i){
        i=L[i].cur;
        ++j;
    }
    return j;
}
//输入操作
void Input_List(StaticLinkList L){
    printf("请输入元素的总个数:");
    int n;
    scanf("%d",&n);
    printf("请输入各个元素值:\n");
    for(int i=1;i<=n;i++){
        scanf("%d",&L[i].data);
    }
    L[0].cur=n+1;
    L[n].cur=0;
    L[MAXSIZE-1].cur=1;
    printf("程序录入完毕!\n");
}
//输出操作
void Output_List(StaticLinkList L){
    int i=L[MAXSIZE-1].cur;
    while(i){
        printf("%d ",L[i].data);
        i=L[i].cur;
    }
    printf("\n");
    printf("程序输出完毕!\n");
}
int main(){
    StaticLinkList L;
    InitList(L);
    int choice=0;
    while(choice!=7){
        printf("**********菜单**********\n");
        printf("|1.输入元素   2.输出元素|\n");
        printf("|3.删除操作   4.插入操作|\n");
        printf("|5.返回表长度   6.初始化链表|\n");
        printf("|7.退出程序|\n");
        printf("请输入你的选择:");
        scanf("%d",&choice);
        switch(choice){
            case 1 :
                {
                    Input_List(L);
                    printf("程序将自动跳转到菜单栏\n");
                    Sleep(1000);
                    system("cls");
                    break;
                }
            case 2 :
                {
                    Output_List(L);
                    printf("程序将自动跳转到菜单栏\n");
                    Sleep(1000);
                    system("cls");
                    break;
                }
            case 3 :
                {
                    int i;
                    printf("请输入你想删除第几个元素:");
                    scanf("%d",&i);
                    ListDelete(L,i);
                    printf("程序将自动跳转到菜单栏\n");
                    Sleep(1000);
                    system("cls");
                    break;
                }
            case 4 :
                {
                    printf("请输入你想在第几个元素前插入一个元素:");
                    int i;
                    scanf("%d",&i);
                    printf("所插入的元素值为:");
                    ElemType e;
                    scanf("%d",&e);
                    ListInsert(L,i,e);
                    printf("程序将自动跳转到菜单栏\n");
                    Sleep(1000);
                    system("cls");
                    break;
                }
            case 5 :
                {
                    int length=ListLength(L);
                    printf("表的长度为:%d\n",length);
                    printf("程序将自动跳转到菜单栏\n");
                    Sleep(1000);
                    system("cls");
                    break;
                }
            case 6 :
                {
                    InitList(L);
                    printf("初始化成功\n");
                    printf("程序将自动跳转到菜单栏\n");
                    Sleep(1000);
                    system("cls");
                    break;
                }
            case 7 :
                {
                    system("cls");
                    printf("程序退出\n");
                }
        }
    }
    return 0;

}

参考文献:

<<大话数据结构>>

  • 0
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值