数据结构C-4-静态链表与双向链表

1、静态链表的操作

//静态链表
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 1000
#define OK 1
#define ERROR -1
typedef int ElemType;
typedef int Status;
typedef struct{
    ElemType data;
    int cur;
}Component,StaticLinkList[MAXSIZE];
Status InitList(StaticLinkList space){
    //space[0].cur;//t头指针
    int i=0;
    for(int i=0;i<MAXSIZE=1;i++)
        space[i].cur=i+1;
    space[MAXSIZE-1].cur=0;
    return OK;
}
//备用链表
int Malloc_SLL(StaticLinkList space){
    int i=space[0].cur;
    if(space[0].cur)
        space[0].cur=space[i].cur;
    return i;
}
Status ListLength(StaticLinkList L){
    int i=L[MAXSIZE-1].cur;
    while(i){
        i=L[i].cur;
        j++;
    }
    return j;
}
Status ListInsert(StaticLinkList L,int i,ElemType e){
    int j,k,l;
    if(i<1||i>ListLength(L)+1)
        return ERROR;
    j=Malloc_SLL(L);//获取备用链表的第一个下标
    if(j){
        L[j].data=e;
        for(l=1;l<=i-1;l++)//找到i前面的元素下标k
            k=L[k].cur;
        L[j].cur=L[k].cur;//继承k的下标
        L[k].cur=j;
        return OK;
    }
    return ERROR;
}
void Free_SSL(StaticLinkList space,int k){
    space[k].cur=space[0].cur;
    space[0].cur=k;
}
Status ListDelete(StaticLinkList L,int i){
    int j,k,l;
    if(i<1||i>ListLength(L)+1)
        return ERROR;
    k=MAXSIZE-1;
    j=L[k].cur;//要删除的下标
    L[k].cur=L[j].cur;
    Free_SSL(L,j);
    return OK;
}

2、双向链表的操作

#include<stdio.h>
#include<stdlib.h>

#define OK 1
#define ERROR -1

typedef int ElemType;
typedef int Status;
typedef struct DuLNode{
    ElemType data;
    struct DuLNode *prior;
    struct DuLNode *next;
}DuLNode,*DuLinkList;

void InitList(DuLinkList *L);
void CreateList(DuLinkList *L);
int GetElem(DuLinkList L,int i);
int LocateElem(DuLinkList L,ElemType key);
void DulLinkInsert(DuLinkList L,int i,ElemType e);
void DeleteDuList(DuLinkList L,int i);
void Display(DuLinkList L);

int main(){
    DuLinkList La;int i;ElemType e;
    InitList(&La);
   CreateList(&La);
    Display(La);
    printf("请输入要查询的序号:");
    scanf("%d",&i);
    printf("该序号所对应的数值为:%d\n",GetElem(La,i));

      printf("请输入要查询的元素值:");
    scanf("%d",&e);
    printf("该值所对应的序号为:%d\n",LocateElem(La,e));

    printf("请输入要插入的序号和元素值:");
    scanf("%d %d",&i,&e);
    DulLinkInsert(La,i,e);
    printf("新序列为:");
    Display(La);

    printf("\n请输入要删除的元素序号:");
    scanf("%d",&i);
    DeleteDuList(La,i);
    printf("新序列为:");
    Display(La);
    return 0;
}

void InitList(DuLinkList *L){
    *L=(DuLinkList)malloc(sizeof(DuLNode));
    if(*L==NULL)
        exit(-1);
    (*L)->next=NULL;
    (*L)->prior=NULL;
}
//创建
void CreateList(DuLinkList *L){
    DuLinkList p,s;
    int n;
    printf("Please enter the length of the list:");
    scanf("%d",&n);
    (*L)=(DuLinkList)malloc(sizeof(DuLNode));
    p=*L;
    printf("Please enter the list:");
    for(int i=0;i<n;i++){
        s=(DuLinkList)malloc(sizeof(DuLNode));
        scanf("%d",&s->data);
        p->next=s;
        s->prior=p;
        p=s;
    }
    p->next=NULL;
}
//按序号查找
int GetElem(DuLinkList L,int i){
    int j=1;
    DuLinkList p=L->next;
    if(i<1)
        exit(-1);
    while(p&&j<i){
        p=p->next;
        j++;
    }
    return p->data;
}
int LocateElem(DuLinkList L,ElemType key){
    int i=1;
    DuLinkList p=L->next;
    if(p==NULL)
        exit(-1);
    while(p&&p->data!=key){
        p=p->next;i++;
    }
    return i;
}
//指定位置插入
void DulLinkInsert(DuLinkList L,int i,ElemType e){
    DuLinkList p,s;
    int j=0;
    p=L;
    while(p&&j<i-1){
        p=p->next;j++;
    }
    s=(DuLinkList)malloc(sizeof(DuLNode));
    s->data=e;
    s->next=p->next;
    if(p->next!=NULL)
        p->next->prior=s;
    p->next=s;
    s->prior=p;
}
//指定位置删除
void DeleteDuList(DuLinkList L,int i){
    DuLinkList p=L->next,q;i--;
    int j=1;
    while(i<1||!p->next)
            exit(-1);
    while(p&&j<i){
        p=p->next;
        j++;
    }
    q=p->next;
    p->next=q->next;
    q->next->prior=p;
    free(q);
}
void Display(DuLinkList L){
    DuLinkList p=L->next;
    int i=0;
    while(p){
        printf("%d ",p->data);
        p=p->next;
        i++;
    }
    printf("\n");
    if(i==0)
        printf("NULL!");
}

3、双向链表的合并

//双向链表
#include<stdio.h>
#include<stdlib.h>

#define OK 1
#define ERROR -1

typedef int ElemType;
typedef int Status;
typedef struct DuLNode{
    ElemType data;
    struct DuLNode *prior;
    struct DuLNode *next;
}DuLNode,*DuLinkList;

void InitList(DuLinkList *L);
void CreateList(DuLinkList *L);
int GetElem(DuLinkList L,int i);
int LocateElem(DuLinkList L,ElemType key);
void DulLinkInsert(DuLinkList L,int i,ElemType e);
void DeleteDuList(DuLinkList L,int i);
void Display(DuLinkList L);
DuLinkList Merge(DuLinkList La,DuLinkList Lb);

int main(){
    DuLinkList La,Lb,Lc;
    InitList(&La);InitList(&Lb);InitList(&Lc);
   CreateList(&La);CreateList(&Lb);
    Display(La);Display(Lb);

    printf("合并后的新序列为:");
    Lc=Merge(La,Lb);
    Display(Lc);
    return 0;
}

void InitList(DuLinkList *L){
    *L=(DuLinkList)malloc(sizeof(DuLNode));
    if(*L==NULL)
        exit(-1);
    (*L)->next=NULL;
    (*L)->prior=NULL;
}
//创建
void CreateList(DuLinkList *L){
    DuLinkList p,s;
    int n;
    printf("Please enter the length of the list:");
    scanf("%d",&n);
    (*L)=(DuLinkList)malloc(sizeof(DuLNode));
    p=*L;
    printf("Please enter the list:");
    for(int i=0;i<n;i++){
        s=(DuLinkList)malloc(sizeof(DuLNode));
        scanf("%d",&s->data);
        p->next=s;
        s->prior=p;
        p=s;
    }
    p->next=NULL;
}


void Display(DuLinkList L){
    DuLinkList p=L->next;
    int i=0;
    while(p){
        printf("%d ",p->data);
        p=p->next;
        i++;
    }
    printf("\n");
    if(i==0)
        printf("NULL!");
}
DuLinkList Merge(DuLinkList La,DuLinkList Lb){
 DuLinkList pa,pb,pc,Lc;
    Lc=(DuLinkList)malloc(sizeof(DuLNode));
    pa=La->next;pb=Lb->next;pc=Lc;
    while(pa&&pb){
        if(pa->data<=pb->data){
            pc->next=pa;pa->prior=pc;pa=pa->next; pc=pc->next;
        }
        else{
            pc->next=pb;pb->prior=pc;pb=pb->next; pc=pc->next;
        }
    }
    while(pa!=NULL){
        pc->next=pa;pa->prior=pc;pa=pa->next; pc=pc->next;
    }
    while(pb!=NULL){
        pc->next=pb;pb->prior=pc;pb=pb->next; pc=pc->next;
    }
    free(La);
    free(Lb);
    return Lc;
}
发布了24 篇原创文章 · 获赞 9 · 访问量 2744

猜你喜欢

转载自blog.csdn.net/fancyZT/article/details/104498931
今日推荐