链表的基本操作

来源:互联网 发布:unity3d模型资源百度云 编辑:程序博客网 时间:2024/06/06 20:16

链表的基本操作

定义单链表

typedef struct node{    int data;    struct node *next;}SLink;

初始化链表

int initList(SLink *L){  L=(SLink*)malloc(sizeof(SLink));//创建头结点  if(L==NULL)//分配节点失败,返回flase  return 0;  L->next = NULL;//设置头结点指针为空  return 1;}

头插法建立链表

/*链表中数字顺序与数组中顺序相反  a[]={1,2,3,4,5} L->5->4->3->2->1*/void createList1(SLink *L,int a[],int n){    L = (SLink*)malloc(sizeof(SLink));    L->next = NULL;    SLink *s;    int i;    for(i=0;i<n;i++)    {        s = (SLink*)malloc(sizeof(SLink));//该节点保存数组中数字        s->data = a[i];        s->next = L->next;        L->next =s;    }}

尾插法建立链表

/*链表与数组顺序相同*/void createList2(SLink *L,int a[],int n){    L=(SLink*)malloc(sizeof(SLink));    L->next = NULL;    SLink *tc = L,*s;    int i;    for(i=0;i<n;i++)    {        s=(SLink*)malloc(sizeof(SLink));        s->data = a[i];        tc->next = s;        tc = s;    }    tc->next = NULL;}

删除链表

void destroyList(SLink *L){   SLink *pre = L,*p = L->next;   while(p!=NULL)   {     free(pre);     pre = p;     p = p->next;   }   free(pre);}

求链表的长度

int getLength(SLink *L){   if(L==NULL) return -1;   int i=0;   SLink *p = L->next;   while(p!=NULL)   {    i++;    p=p->next;   }   return i;}

求链表中第i个元素

int getElem(SLink *L,int i,int *e){    if(i<1)return -1;//参数i错误,返回-1    else    {        int j=1;        SLink *p = L->next;        while(p!=NULL&&j<i)        {            j++;            p=p->next;        }        if(p==NULL) return 0;//未找到,则返回0        else        {            *e = p->data;            return 1;//找到返回1        }    }}

查找某值的位置

int locate(SLink *L,int m){    if(L==NULL) return -1;//如果链表为NULL 返回-1    else    {        int j=1;        SLink *p = L->next;        while(p!=NULL&&p->next!=m)        {            j++;            p=p->next;        }        if(p==NULL) return 0;//未找到则返回0        else        {            return j;//找到返回位置        }    }}

链表i位置插入元素

int insertList(SLink *L,int i,int m){    if(i<1) return -1;//参数i错误,返回-1    else    {        int j=0;        SLink *p = L;        while(p!=NULL&&j<i-1)//查找第i-1个节点        {            j++;            p=p->next;        }        if(p==NULL) return 0;//未找到,返回0        else        {            SLink *s = (SLink*)malloc(sizeof(SLink));            s->data = m;            s->next = p->next;//将s节点插入到p节点之后            p->next = s;            return 1;//插入成功返回1        }    }}

删除元素运算算法

int delElem(SLink *L,int i){    if(L==NULL) return -1;//如果链表为NULL 返回-1    else    {        int j=0;        SLink *p =L;        while(p!=NULL&&j<i-1)//查找第i-1个节点        {            j++;            p=p->next;        }        if(p==NULL) return 0;//未找到第i-1个节点        else        {            SLink *q = p->next;            if(q==NULL) return 0;//第i个节点不存在,则返回0            else            {                p->next = q->next;//删除第i个节点                free(q);                return 1;            }        }    }}

仓促之中,难免疏漏;如有错误,欢迎指正。

0 0
原创粉丝点击