单链表以及双向链表的操作

#include<stdio.h>
#include<stdlib.h>
#define MAX 30
typedef struct s       //单向链表的存储结构
{
    int data;
    struct s *next;
}S,*LinkList;
typedef struct DuList   //双向链表的存储结构
{
    int data;
    struct DuList *prior;
    struct DuList *next;
}DuLNode,*DuLinkList;
int InitList(S *s)             //创建空的单链表
{
    s=(S *)malloc(sizeof(S));
    s->next=NULL;
    if(!s)return 0;
    else return 1;
}
void ShuChu(S *p1)       //输出单链表
{
        while(p1!=NULL)
    {
        printf("%d ",p1->data);
        p1=p1->next;
    }
}
void CreateList(LinkList s,int n)     //为所创建的单链表增加数据
{
    int i,m;
    S *r,*p1;
    S *p;
   // s=(S *)malloc(sizeof(S));
    s->next=NULL;
    r=s;
    for(i=0;i<n;i++)
    {
        scanf("%d",&m);
        p=(S *)malloc(sizeof(S));
        p->data=m;
        p->next=NULL;
        r->next=p;
        r=p;
    }
    p1=s->next;
    /*while(p1!=NULL)
    {
        printf("%d ",p1->data);
        p1=p1->next;
    }*/
    ShuChu(p1);
}
void ListInsert(S *s,int n,int m)       //单链表中值的插入
{
    int i=1;
    S *p,*r,*p1;
    p=(S *)malloc(sizeof(S));
    r=s->next;
    p->data=m;
    while(i<(n-1)&&r!=NULL)
    {
        r=r->next;
        i++;
    }
    if(i==n-1)
    {
        p->next=r->next;
        r->next=p;
    }
        p1=s->next;
        ShuChu(p1);
}
void ListDelect(S *s,int n)      //单链表删除
{
    int i=1;
    S *p,*p1,*q;
    p=s->next;
    while(i<n-1&&p)
    {
        p=p->next;
        i++;
    }
    if(i==n-1)
    {
        q=p->next;
        p->next=p->next->next;
        free(q);
    }
        p1=s->next;
        ShuChu(p1);
}
void LocateElem(S *s,int m)    //查找单链表中是否有要查找的值
{
    S *p;
    int i=1;
    p=s->next;
    while(p)
    {
        if(p->data==m)
        {
            printf("找到了!,其所在位置为%d",i);
            break;
        }
        i++;
        p=p->next;
    }
}
int DuInitList(DuLinkList s1)           //建立空的双向链表
{
    s1=(DuLNode *)malloc(sizeof(DuLNode));
    s1->next=NULL;
    if(!s1)return 0;
    else return 1;
}
void ShuChu1(DuLinkList s3)       //输出双向链表中的值
{
    while(s3)
    {
        printf("%d ",s3->data);
        s3=s3->next;
    }
    printf("\n");
}
void CreateList_DuL(DuLinkList s2,int n)     //向所创建的双向链表增加数
{
    s2->next=NULL;
    DuLinkList s3,r,s1;
    int i=1,m;
    r=s2;
    while(i<=n)
    {
            s3=(DuLNode *)malloc(sizeof(DuLNode));
        //    s3->next=NULL;
            scanf("%d",&m);
            s3->data=m;
            s3->next=NULL;
             r->next=s3;
             
            // s3->prior->next=s3;
             r=s3;
             i++;
    }
    s1=s2->next;
    ShuChu1(s1);
}
void ListInsert_DuL(DuLinkList s1,int n,int m1)         //向双向链表中插入数
{
      DuLinkList s2,p,s3;
      p=(DuLNode *)malloc(sizeof(DuLNode));
      int n1=1;
      s2=s1->next;
      while(s2&&n1<n-1)
      {
          s2=s2->next;
          n1++;
      }
      if(n1==n-1)
      {
          p->data=m1;
          p->next=s2->next;
          s2->next=p;
          p->next->prior=p;
          p->prior=s2;
      }
      s3=s1->next;
      ShuChu1(s3);
}
void ListDelect_DuL(DuLinkList s2,int n)      //删除双向链表第n个位置的值
{
    int i=1;
    DuLinkList s1,s3;
    s1=s2->next;
    while(i<n&&s1)
    {
        s1=s1->next;
        i++;
    }
    if(n==i)
    {
        s1->prior->next=s1->next;
        s1->next->prior=s1->prior;
    //i++;
    }
    s3=s2->next;
    ShuChu1(s3);
}
int main()
{
    S s,s1;
    DuLNode s2;
    int m,n,m1,n1;
    m=InitList(&s);
//    s1=s;
    if(m==1)
    printf("内存分配完成!\n");
    printf("请输入所创建的单链表的数据个数:\n");
    scanf("%d",&n);
    printf("请输入数:\n");
    CreateList(&s,n);
    printf("请输入要插入的数的位置及数:\n");
    scanf("%d%d",&m,&n);
    ListInsert(&s,m,n);
    printf("请输入要删除的数的位置:\n");
    scanf("%d",&n);
    ListDelect(&s,n);
    printf("请输入要查找的数:\n");
    scanf("%d",&m);
    LocateElem(&s,m);
    printf("\n");
    m1=DuInitList(&s2);
    if(m1==1)
    printf("双向链表初始化完成!\n");
        printf("请输入所创建的链表的数据个数:\n");
    scanf("%d",&n);
        printf("请输入数:\n");
    CreateList_DuL(&s2,n);
    printf("请输入要插入的数的位置以及数:\n");
    scanf("%d%d",&n,&m1);
    ListInsert_DuL(&s2,n,m1);
    printf("请输入要删除的数的位置:\n");
    scanf("%d",&n);
    ListDelect_DuL(&s2,n);
    return 0;
}

posted @ 2018-12-06 22:04  哪有什么岁月静好,只不过有人替你负重前行  阅读(109)  评论(0编辑  收藏  举报