单向线性表的一些基本操作

(参考书籍,《数据结构》,清华大学出版社
#include<stdio.h>
#include<stdlib.h>
//预定义常量
#define True 1                //真
#define False 0               //假
#define OK 1                  //正常
#define ERROR 0               //错误
#define INFEASIBLE -1         //不可行
#define OVERFLOW -2           //上溢
typedef int Status;           //Status表示状态,实际类型是int,相当于int的别名
typedef int ElemType;
typedef int Status;
#define MAX_SIZE 100
typedef struct sqlist
{
    ElemType data;
    struct sqlist *next;  //指针域
    ElemType Elem_array[MAX_SIZE];
    int length;   //定义线性表的长度
}Sqlist;
Sqlist *create_LinkList(void);
Sqlist *create_LinkList_weichafa(void);
ElemType Delete_Sqlist(Sqlist *L,int i);
Status Init_SqList( struct sqlist *L);
Status Inset_SqList(Sqlist*L,int i,ElemType e);
Status Locate_Delete_Sqlist(Sqlist *L,ElemType x);
void Isert_Sqlist(Sqlist *L,int i,ElemType e);
ElemType Get_Elm(Sqlist *L,int i);
void Delete_LinkList(Sqlist *L,int i);
void Delete_Sqlist_value(Sqlist *L);
//线性表的初始化
Status Init_SqList( struct sqlist *L)
{
    L=(Sqlist *)malloc(sizeof(Sqlist));       //动态生成对象指针的时候,应该用对象,释放的时候应该用free(p)
    //L->Elem_array=(ElemType *)malloc(MAX_SIZE*sizeof(ElemType));
    if(!L->Elem_array)
        return  ERROR;
        else
    {
        L->length=0;
        return OK;
    }
}
//线性表的插入,在固定位置插入,O(n)
Status Inset_SqList(Sqlist*L,int i,ElemType e)
{
    int j;
    if(i<0||i>L->length-1)
        return ERROR;
    if(L->length>=MAX_SIZE)
    {
        printf("线性表溢出!\n");
        return ERROR;
    }
    for (j=L->length-1;j>=i-1;--j)
    {
        L->Elem_array[j+1]=L->Elem_array[j];
        L->Elem_array[i-1]=e;
    }
}
//顺序线性表的删除,时间复杂度为O(n)

ElemType Delete_Sqlist(Sqlist *L,int i)
{
    int k;
    ElemType x;
    if(L->length==0)
    {
        printf("线性表L为空!\n");
        return ERROR;
    }
    else if(i<1||i>L->length)
    {
        printf("要删除的数据不存在!\n");
        return ERROR;
    }
    else
    {
        x=L->Elem_array[i-1];
        for(k=i;k<L->Elem_array;k++)
        {
            L->Elem_array[k-1]=L->Elem_array[k];
        }
        L->length--;
        return (x);  //返回所删除的值
    }
}
//时间列表查找定位删除,时间复杂度为
//先进行查找,然后从找到的位置之最后后一个结点依次向前移动一个位置
//时间复杂度为O(n)
Status Locate_Delete_Sqlist(Sqlist *L,ElemType x)
{
    ElemType i=0,k;
    while(i<=L->length)
    {
        if(L->Elem_array[i]!=x)
            i++;
        else
           {
               for(k=i;k<L->length;k++)
            L->Elem_array[k]=L->Elem_array[k+1];
            L->length--;
            break;
            }
    }
    if(i>L->length)
       {
           printf("线性表中没有所要求删除的数");
           return ERROR;
           }

        return OK;
}
//线性表的链式存储,必须储存脸型表的结点和链

//建立单链表.时间复杂度都是O(n);
//头插法,输出的顺序与输入的顺序相反
Sqlist *create_LinkList(void)
{
  int data;
  Sqlist *head;
  head = (Sqlist *)malloc(sizeof(Sqlist));
  head->next=NULL;
  while(1)
  {
      Sqlist *p;
      printf("please input the number!!");
      scanf("%d",&data);
      if(data==0)
        break;
      else
       {
           p=(Sqlist *)malloc(sizeof(Sqlist));
           p->data=data;
           p->next=head->next;
           head->next=p;
           }

        }
        return (head);
}
//尾插法建立链表
Sqlist *create_LinkList_weichafa(void)
{
   int data;
   Sqlist *head,*temp;
   head = (Sqlist *)malloc(sizeof(Sqlist));
   head->next = NULL;
   temp = (Sqlist *)malloc(sizeof(Sqlist));
   temp = head;
   while(1)
   {
       printf("please input the number!!!");
       scanf("%d",&data);
       if(data==0)
        break;
       else
       {
           Sqlist *p;
           //temp = (Sqlist *)malloc(sizeof(Sqlist));
           p = (Sqlist *)malloc(sizeof(Sqlist));
           p->data=data;
           temp ->next=p;
           p->next=head->next;
           temp = p;
       }
   }
   temp->next=NULL;
   return (head);
}
//单链表的查看,查看前n个数据
ElemType Get_Elm(Sqlist *L,int i)
{
    int j;
    Sqlist *p;
    p = L->next;
    j=1;
    while(j<i)
    {
        if(p==NULL)
            return (0);
        else
        {p=p->next;
        j++;
        if(j==i)
            return (p->data);}
    }
}
//单链表的插入,时间复杂度为O(n)
void Isert_Sqlist(Sqlist *L,int i,ElemType e)
{
    int j=0;
    Sqlist *temp,*p;
    temp = L->next;
    if(i==1)
    {
        p=(Sqlist *)malloc(sizeof(Sqlist));
        p->data = e;
        L->next = p;
        p->next = temp;
    }
    else
    {
    while(p!=NULL&&(j++)<i-2)
        temp = temp->next;
    if(--j!=i-1)
        printf("所输入的i值过大!!!");
    else
    {
        p=(Sqlist *)malloc(sizeof(Sqlist));
        p->data = e;
        p->next = temp->next;
        temp->next = p;
            }
    }
}
//单链表的删除,时间复杂度为O(n),按序号删除
void Delete_LinkList(Sqlist *L,int i)
{
   int j=1;
   Sqlist *temp,*p;
   temp = L->next;
   p = temp->next;
   if(i==1)
   {
       L->next = p;
       free(temp);
   }
   else
   {
   while(p->next!=NULL&&j<i-1)   //查找结点
   {
       temp = p;
       p = p->next;
       j++;
   }
   if(j!=i-1)
    printf("所要删除的数不再线性表中!!!");
    else
   {
       temp->next = p->next;   //删除结点
       free(p);
   }
   }
}
//删除链表中所有值的重复的结点,使所用的结点不相同
void Delete_Sqlist_value(Sqlist *L)
{
    Sqlist *p = L->next,*q,*ptr;
    while(p!=NULL)
    {
        q = p;
        ptr = p->next;
        while(ptr!=NULL)     //在尾部做特殊处理
        {
            if(ptr->data==p->data)
            {
                if(ptr->next ==NULL)
                {
                    q->next = ptr->next;
                    free(ptr);
                    break;
                }
               else
               {
                q->next = ptr->next;
                free(ptr);
                q = q->next;
                ptr = q->next;}
            }
            else
            {
                q = q->next;
                ptr = ptr->next;
            }
        }
        if(p->next==NULL)
            break;
        else
        p = p->next;
    }
}
//单链表的合并,把头指针为La,Lb的合并成Lc

int main()
{
    Sqlist *L;
    int i,e;
    ElemType i2;
    L = create_LinkList_weichafa();
    Sqlist *dis;
    dis = L->next;
    while(dis!=NULL)
    {
        printf("%d",dis->data);
        dis = dis->next;
    }
    printf("\n");
    //printf("请输入所要删除的第几个");
    //scanf("%d",&i);
    Delete_Sqlist_value(L);  //对函数的测试,这里可以改变函数体,在上面输入函数的参数,可以前后的输出,然后观察函数的功能
    Sqlist *dis2;
    dis2 = L->next;
    while(dis2!=NULL)
    {
        printf("%d",dis2->data);
        dis2 = dis2->next;
    }
    printf("\n");
    printf("请输入所要查看的个数;");
    scanf("%d",&i);
    i2=Get_Elm(L,i);
    printf("%d",i2);
    return 0;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值