实验二 线性表的链式存储结构
顺序表的逆置
typedef struct LinkList
{
ElemType data[MAX_SIZE];
int length;
}LinkList;
Status ReverseList(LinkList *L)
{
int i;
ElemType temp;
if(L->length==0)
{
printf("表为空!\n");
return ERROR;
}
else
{
for(i = 0;i<L->length/2;i++)
{
temp = L->data[i];
L->data[i] = L->data[L->length-i-1];
L->data[L->length-i-1]=temp;
}
}
}
逆置一个单链表有3种方法,这里我们将完整的实现:
方法 1):头插法建立新的链表 建立一个新的链表,把原来的单链表从头顺序遍历,遍历的每个结点都用头插法插入到新的链表中,这样新的链表自然就成原来 的逆置得了。由于要遍历原来链表和建立新的链表,所以这种方法时间和空间复杂度都为O(n),好处是不用修改原来的链表,坏处就是多了空间复杂度。这种方法是最常用。
方法2):原地逆置这种方法主要是每每修改两个相邻结点p,q
的前后关系,增加一个t
保存下一次的修改目标结点,既然都叫原地逆置了,所以空间复杂度为O(1) ,时间同样为O(n),但是这种方法修改了原来的链表,所以要特别注意,慎重使用。注意不要形成环了,可以在idea中跑跑。
方法3):使用递归,reverse(head),出口设置为head==null 和head.next==null
,但是特别注意递归子情况的判断,详情参见代码。
typedef struct LNODE {
ElemType data;
struct LNODE *next;
} LNode,*LinkList;
Status Invert(LinkList L) {
LinkList p=L->next,q=NULL;
L->next=NULL;
while (p) {
q=p->next;
p->next=L->next;
L->next=p;
p=q;
}
return OK;
}
求差集