顺序表与链表操作

2-1-1 线性表Seqlist的创建,代码如下:
#define maxn 100  //线性表的最大长度
typedef struct
{
    int elem[maxn];
    int last;
} Seqlist;
2-1-2顺序表的插入运算,代码如下:
#include<stdio.h>
#define maxn 100
typedef struct
{
    int elem[maxn];
    int last;
} Seqlist;
int Insert(Seqlist *L,int i,int e)
{
    if(i < 1 || i > L->last+2)//判断插入位置是否合法
    {
        printf("error!\n");
        return 0;
    }
    if(L->last >= maxn-1)
    {
        printf("已满\n");
        return 0;
    }
    for(int k = L->last;   k >= i-1;  k--)//为插入移动位置
        L->elem[k+1] = L->elem[k];
    L->elem[i-1] = e;
    L->last++;
    return 1;
}
int main()
{
    Seqlist a;
    int n,m,x;
    while(~scanf("%d",&n))
    {
        for(int i =0; i<n;i++)
            scanf("%d",&a.elem[i]);
        a.last=n-1;
        printf("插入元素的位置和值:");
        scanf("%d %d",&m,&x);
        printf("插入前:\n");
        for(int i = 0;i<n;i++)
            printf("%d ",a.elem[i]);
        printf("\n");
        if(Insert(&a,m,x))
        {
             printf("插入后:\n");
            for(int i=0; i<n+1; i++)
                printf("%d ",a.elem[i]);
        }
        printf("\n16031110208尚艳丽\n");
    }
    return 0;
}
2-1-3顺序表的删除运算,代码如下:
#include<stdio.h>
#define maxn 100
typedef struct
{
    int elem[maxn];
    int last;
} Seqlist;
int Delete(Seqlist *L,int i,int *e)//顺序表的删除
{
    if(i < 1 || i > L->last+1)//判断删除位置
    {
        printf("error!\n");
        return 0;
    }
    *e=L->elem[i-1];//将删除元素存放在e所指向的变量中
    for(int k = i; k<=L->last; k++)
        L->elem[k-1] = L->elem[k];//后面元素依次后移
    L->last--;
    return 1;
}
int main()
{
    Seqlist a;
    int n,m,x;
    while(~scanf("%d",&n))
    {
        for(int i =0; i<n; i++)
            scanf("%d",&a.elem[i]);
        a.last=n-1;
        printf("删除元素位置:");
        scanf("%d",&m);
        printf("\n删除前:\n");
        for(int i = 0; i<n; i++)
            printf("%d ",a.elem[i]);
        printf("\n");
        if(Delete(&a,m,&x))
        {
            printf("删除后:\n");
            for(int i=0; i<=a.last; i++)
                printf("%d ",a.elem[i]);
        }
        printf("\n16031110208尚艳丽\n");
    }
    return 0;
}
2-2-1初始化单链表数据,代码如下:
typedef struct Note//节点类型定义
{
    char a;
    struct Note* next;
} Note,*list;
InitList(list *L)
{
    *L(list)malloc(sizeof(Node));//建立头结点
    (*L)->next=NULL;//建立空的单链表
}
2-2-2创建链表并输出,代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Note
{
    char a;
    struct Note* next;
} Note,*list;
void CF(list L)//头插法建表
{
    Note *s;
    char c;
    int flag = 1;
    while(flag)
    {
        c = getchar();
        getchar();
        if(c != '$')
        {
            s=(Note*)malloc(sizeof(Note));//建立新的节点
            s->a=c;
            s->next=L->next;//将s节点插入表头
            L->next=s;
        }
        else flag = 0;
    }
}
int main()
{
    list L,s;
    L=(list)malloc(sizeof(Note));
    L->next=NULL;
    CF(L);
    s=L->next;
    printf("头插法建表输出单链表:\n\n");
    while(s->next!=NULL)
    {
        printf("%c ",s->a);
        s=s->next;
    }
    printf("%c\n",s->a);
    printf("\n16031110208尚艳丽\n");
    return 0;
}
2-2-3单链表获得第i个元素,代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Note
{
    char a;
    struct Note* next;
} Noet,*list;
Note* get(list L,int i)  //查找第i个元素
{
    int j;
    Note *p;
    p=(Note*)malloc(sizeof(Note));
    if(i<=0)return NULL;
    p=L->next,j=0;
    while(p->next!=NULL&&j<i)
    { p=p->next;  j++;    //计数器  }
    if(i==j)    //找到第i节点
        return p;
    else return NULL; //找不到返回空
}
int main()
{
    list L,s,t;
    char c;
    int flag=1;
    L=(Note*)malloc(sizeof(Note));
    L->next=NULL;   t=L;
    while(flag)//尾插法建表
    {
        c=getchar();  getchar();
        if(c!='$')
        { s=(Note*)malloc(sizeof(Note));
            s->a=c; t->next=s; t=s;
        }
        else
        { flag=0; t->next=NULL; }
    }
    int n;
    printf("查找元素位置:");
    scanf("%d",&n);
    Note*r;
    r=(Note*)malloc(sizeof(Note));
    if(get(L,n)!=NULL)
    {
        r=get(L,n-1);
        printf("\n输出查找元素:\n\n");
        printf("%c\n",r->a);
    }
    printf("\n16031110208尚艳丽\n");
    return 0;
}
2-2-4单链表中插入元素,代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct Note
{
    int a;
    Note* next;
} Note,*list1;
bool insert(list1 L,int i,int e)//单链表的插入
{
    Note*p,*s;
    int k=0;
    if(i<=0)  return false; 
    p=L;
    while(p!=NULL&&k<i-1)
    {p=p->next; k++;}
    if(p==NULL)//如果当前位置为空表示已找完,但没有到第i个元素说明插入位置不合理
    { printf("插入错误\n");  return false;}
    s=(Note*)malloc(sizeof(Note));  //申请新的节点
    s->a=e;
    s->next=p->next;    //修改指针 完成插入
    p->next=s;
    return true;
}
int main()
{
    list1 L,r,s;
    L=(Note*)malloc(sizeof(Note));
    L->next=NULL;
    printf("插入前:\n\n");
    int flag=1,c;
    r=L;
    while(flag)  //尾插法建表
    {
        scanf("%d",&c);
        if(c!=0)
        {
            s=(Note*)malloc(sizeof(Note));
            s->a=c; r->next=s;  r=s;
        }
        else
        { flag=0; r->next=NULL; }  
    }
    int n,m;
    printf("插入元素位置和值:");
    scanf("%d %d",&n,&m);
    if(insert(L,n,m))
    {
        printf("\n插入后:\n");
        while(L->next!=NULL)
        { L=L->next;   printf("%d ",L->a);}
    }
    else printf("插入错误\n");
    printf("\n16031110208尚艳丽\n");
    return 0;
}
2-2-5单链表中删除元素,代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct Note
{
    int a;
    Note* next;
} Note,*list1;
bool dele(list1 L,int i,int *e)  //单链表的删除
{
    Note*p,*s;
    int k=0;
    if(i<=0)
        return false;
    p=L;
    while(p!=NULL&&k<i-1)
    {   p=p->next; k++;  }
    if(p->next==NULL)
    { printf("删除位置错误\n");  return false;  }
    s=p->next;
    p->next=s->next;//修改指针 删除节点r
    *e=s->a;
    free(s);  //释放被删除的节点所占空间
    return true;
}
int main()
{
    list1 L,r,s;
    L=(Note*)malloc(sizeof(Note));
    L->next=NULL;
    int flag=1,c;
    r=L;
    printf("删除前:\n\n");
    while(flag)  //尾插法建表
    {
        scanf("%d",&c);
        if(c!=0)
        {
            s=(Note*)malloc(sizeof(Note));
            s->a=c; r->next=s;  r=s;
        }
        else
        {flag=0;r->next=NULL;}
    }
    int n,m;
    printf("删除元素位置:");
    scanf("%d",&n);
    if(dele(L,n,&m))
    {
        printf("\n删除后:\n");
        while(L->next!=NULL)
        {   L=L->next; printf("%d ",L->a);    }
    }
    else printf("\n删除位置错误\n");
    printf("16031110208尚艳丽\n");
    return 0;
}
2-3合并两个单链表,代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct Note
{
    int a;
    Note* next;
} Note,*list1;
void CF(list1 L)  //创建单链表
{
    Note *r,*s;
    int flag=1,c;
    r=L;
    while(flag)  //尾插法
    {
        scanf("%d",&c);
        if(c!=0)
        {  s=(Note*)malloc(sizeof(Note));
            s->a=c;  r->next=s;  r=s;
        }
        else
        { flag=0; r->next=NULL; ;//将最后一个结点的next链域置为空表示结束  }      
    }
}
Note *mergelist(list1 LA,list1 LB)  //合并单链表
{
    Note *pa,*pb,*r;//pa,pb 分别指向两个单链表LA,LB中的第一个节点
    list1 LC;
    pa=LA->next;  pb=LB->next;
    LC=LA;  LC->next=NULL;    r=LC;
    while(pa!=NULL&&pb!=NULL)//两个表未处理完时选择较小的值节点插入LC
    {
        if(pa->a <= pb->a)
        {r->next=pa;r=pa;pa=pa->next;}
        else
        {r->next=pb;r=pb;pb=pb->next;}
    }
    if(pa)  //表LA未完
        r->next=pa;
    else   //表LB未完
        r->next=pb;
    free(LB);
    return LC;
}
int main()
{
    list1 LA,LB,LC;
    LA=(list1)malloc(sizeof(Note));//初始化链表
    LA->next=NULL;
    LB=(list1)malloc(sizeof(Note));
    LB->next=NULL;
    printf("合并前:\n\n");
    CF(LA);  CF(LB);
    LC=(list1)malloc(sizeof(Note));  //初始化
    LC->next=NULL;
    LC=mergelist(LA,LB);
    printf("合并后:\n");
    LC=LC->next;
    while(LC!=NULL)
    { printf("%d ",LC->a);   LC=LC->next;  }
    printf("\n16031110208尚艳丽\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_39531549/article/details/78161292