单链表的基本操作

来源:互联网 发布:海绵城市模型软件 编辑:程序博客网 时间:2024/05/30 04:08

1.单链表的建立

LinkList *CreateLinkList()//建立一个带头结点的单链表并返回其头结点的地址{     char ch;     int x;     LinkList *head;//head为头结点指针     LinkList *r,*P;//r为尾指针,P为新申请结点指针     head=(LinkList *)malloc(sizeof(LinkList));//申请头结点     head->next=NULL;//生成头结点     r=head;//尾指针初始化     ch=getchar();//ch为建立与否的标志     while(ch!='*')//"*"为输入数据结束的符号     {         scanf("%d",&x);//读入新的数据元素         P=(LinkList *)malloc(sizeof(LinkList));//申请新结点         P->data=x; P->next=NULL;//生成新结点         r->next=P;//新结点插入链尾         r=r->next;//修改尾指针         ch=getchar();//读入建立与否的标志     }     return head;//返回表头结点指针}


2.求表长

int LengthLinkList(L)//求单链表L的长度LinkList *L{    LinkList *P=L;//初始化指针变量P,使其指向头结点    int j=0;//初始化变量j    while(P->next!=NULL)    {        P=P->next;        j++;//指针传递,P所指的是第j个结点    }    return j;//返回表长}

3.元素的查找

LinkList *GetLinkList(L,i)//在单链表L中查找第i个元素并返回其位置,无第i个元素返回NULLLinkList *L;int i;{    LinkList *P;    int j=0;    P=L;//让P指向头结点    while((j<i)&&(P->next!=NULL))//当未找到第i个结点且表不空继续找    {      P=P->next;      j++;    }    if(j==i)        return P;    else         return NULL;}//GetLinkList



4.插入

LinkList *insertLinkList(L,x,i)//在单链表L中第i个位置插入值为x的结点LinkList *L;elemtype x,int i;{    LinkList *P,*S;    P=getLinkList(L,i-1);//查找第i-1个结点    if(P==NULL)        printf("第i-1个元素不存在,参数i有错\n");    else    {        S=(LinkList *)malloc(sizeof(LinkList));//申请结点        S->data=x;//填元素值x        S->next=P->next;//新结点插入第i-1个结点后面        P->next=S;    }}//insertLinkList


5.删除

LinkList *deleteLinkList(&L,i)//删除单链表L中第i个结点LinkList *L;int i;{    LinkList *P,*S;//定义局部变量    P=GetLinkList(L,i-1);//查找第i-1个结点    if(P==NULL)        printf("第i-1个元素不存在,参数i有错\n");    else    {        S=P->next;//S指向第i个结点        P->next=S->next;//删除第i个结点        free(S);//释放被删结点空间    }}//deleteLinkList


6.单链表逆置

算法思路:依次从原链表中取出每个结点,每次都把它作为第一个结点插入到新链表中去。为此要借用两个指针变量p和q,p是用来指向原链表中的当前第一个结点,q用来指向从原表取出的每一个结点并利用它插入到新链表中去,当p为空时,完成逆置。

void reverse(H)//该算法完成对单链表H的逆置LinkList *H;{    LinkList *P,*q;    P=H->next;//P指向第一个结点    H->next=NULL;//将原链表置为空表    while(P!=NULL)    {        q=P;//q指向原链表当前第一个结点        P=P->next;//P指向下一个结点        q->next=H->next;//将新链表当前第一个结点插在q后        H->next=q;//把q插入头结点中    }}//reserve


原创粉丝点击