当前位置:C++技术网 > 资讯 > 单链表的学习心得

单链表的学习心得

更新时间:2015-11-07 23:25:52浏览次数:1+次

这是我第三遍学习数据结构,之前两次的学习,都很迷糊,因此,学习第三次,这次学起来不再吃力。线性表的链式存储是采用一组任意的存储单元来存放线性表的元素。这组存储单元可以是连续的也可以是不连续的。为了表示每个元素与其直接后继的逻辑关系,除了存储元素本身的信息外,还需要存储指示其后继元素的地址信息。这两部分的存储的结构称为结点:

单链表上的基本运算包括链表的建立,单链表的插入,单链表的删除,单链表的长度等。带有头结点的单链表的运算具体实现如下(算法的实现保存在文件LinkList.h):
void InitList(LinkList *head);
int ListEmpty(LinkList head);//将单链表初始化为空。动态生成一个头结点,并将头结点的指针域置为空;
LinkNode *Get(LinkList head,int i);///查找单链表中的第i个结点。查找成功则返回该结点的指针
ListNode *LocateElem(LinkList head,DataType e);///查找单链表中元素值为e的元素
int LocatePos(LinkList head,DataType e);////查找单链表中元素值为e的元素,查找成功将对应的元素序号返回。
int InsertList(LinkList head,int i,DataType e);//在单链表中第i个位置插入一个结点,结点的元素值为e。成功就返回1。我们具体看下这个函数的实现:


int InsertList(LinkList head,int i,DataType e)
{
    ListNode *p,*pre;
    int j;
    pre=head;
    j=0;
    while(pre->next!=NULL && j<i-1)/*找到第i-1个结点,也就是第i个结点的前驱结点*/
    {
        pre=pre->next;
        pre=pre;
    }
    if(j!=i-1)
    {
        printf("插入位置错误!")
        return 0;
    }
/*新生成一个结点*/
    if((p=(ListNode *)malloc(sizeof(ListNode)))==NULL)
    {
        exit(-1);
    }
    p->data=e;
    p->next=pre->next;///pre->next就是原来的第i个元素,现在将其传给新插入的结点p的后继结点p->next就是现在插入结点后的第i个元素的前驱结点
    pre->next=p;////插入的结点p就是现在第i-1个元素(pre->next)的后继结点;
    /////切记最后两句代码不能换位置
}
下面我们做个小程序,实现如果在单链表A中出现的元素也在单链表B中出现,则将A中的该元素删除
程序实现如下:



#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
typedef int DataType;
typedef struct Node{
    DataType data;
    struct Node *Next;
} ListNode, *LinkList;
#include "LinkList.h"
void DelElem(LinkList A,LinkList B);
void mian()
{
    int i;
    DataType a[]={2,3,6,7,9,14,56,45,65,67};
    DataType b[]={3,4,7,11,34,54,45,67};
    LinkList A,B;
    LinkNode *p;
    InitList(&A);
    InitList(&B);
    for(int i=1; i<=sizeof(a)/sizeof(a[0];i++)
    {
        if(InsertList(A,i,a[i-1]==0)
        {
            printf("位置不合法");
            return 0;
        }
    }
    
    for(int i=1; i<=sizeof(b)/sizeof(b[0];i++)
    {
        if(InsertList(B,i,b[i-1]==0)
        {
            printf("位置不合法");
            return 0;
        }
    }
    for(int i=1; i<=ListLength(A);i++)
    {
        p=Get(A,i);
        if(p)
        {
            printf("%4d",p->data);
        }
    }
    printf("\n");

    for(int i=1; i<=ListLength(B);i++)
    {
        p=Get(B,i);
        if(p)
        {
            printf("%4d",p->data);
        }
    }
    printf("\n");
    
   DelElem(A,B);
   /*输出删除元素后的链表A*/
    for(int i=1; i<=ListLength(A);i++)
    {
        p=Get(A,i);
        if(p)
        {
            printf("%4d",p->data);
        }
    }
    printf("\n");

void DelElem(LinkList A,LinkList B)
{
    int i,pos;
    DataType e;
    ListNode p;
    for(int i=1; i<ListLength(B); i++)
    {
        p=Get(B,i);
        if(p)
        {
            pos=LocatePos(A,p->data);
            if(pos>0)
            {
                DeleteList(A,pos,&e);
             }
         }
    }
}
这个程序你可以运行试试