更新时间: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);
}
}
}
}
这个程序你可以运行试试
相关资讯