链表(一):单链表2

来源:互联网 发布:2017编程语言排名 编辑:程序博客网 时间:2024/06/06 13:02

    上一篇讲了怎么创建一个空链表,和一个数据为n的初始化链表,这一篇就讲一下怎么在中间插入和删除节点以及查找节点所在的位置。


引用上一篇的图:


   如图所示,要在p3和p2之间插入p1,只需把p3的next指针指向p1,再把p1的next指向p2即可。(注意顺序不能错)

实现如下:

void InsertNode(Linklist *L , int pos , ElemType e)//pos为插入的位置,即在链表第pos位后插入一个节点,e为插入的数据{    Linklist p,q;    q = *L;    while( pos-- )    {        q = q->Next;    }    p = (Linklist)malloc(sizeof(Node));   //因为是新插入的节点,所以需要用malloc申请空间!    p->data = e;    p->Next = q->Next;    q->Next = p;}

    删除节点也是同理,只要把被删除节点的前一节点的next指针指向被删除节点的下一个节点即可,同时可以free掉被删除节点。(同样顺序很重要)

实现如下:

void Deletedata(Linklist *L , int pos , ElemType *e)//pos为删除的位置,把被删除节点的数据存入e中{    Linklist p,q;    q = *L;    while( --pos )    {        q = q->Next;       //此时q代表被删节点的前一节点,这个很重要    }    p = q->Next;          //p为将要被删节点    q ->Next = p->Next;    *e = p->data;    free(p);}
    而查找节点所在的位置其实更简单了,只要一个个从头遍历,找到相同的,返回当前的位置就行。

实现如下:

int Searchdata(Linklist L , ElemType e)  //不需要对链表进行操作,传入L{    int pos=0;    Linklist p;    p = L;    while( p->Next )     //若p->Next == NULL 则跳出while    {        pos++;        p = p->Next;        if( e == p->data )   //如果e跟链表中的某一个节点的data相同,则退出当前循环        {            break;        }    }    if( p-> Next )    {        return pos;      //若找到相同的,返回节点位置    }    else        return -1;      //若没有找到,返回-1}

   好了,单链表的内容差不多就这些。

0 0
原创粉丝点击