线性表--- 链表

本文详细介绍了线性表的链式存储结构及其相关操作的实现过程,包括初始化、销毁、长度计算、空表判断、元素获取与插入。通过C++代码实例展示了如何高效地进行线性表的链式存储与基本操作。

维基百科:

http://zh.wikipedia.org/wiki/%E9%93%BE%E8%A1%A8

线性表的链式存储结构

线性表顺序存储结构特点:

它是一种简单、方便的存储结构。它要求线性元素的数据元素依次存放在连续的存储单元中。

暴露的问题:

1. 在做插入或删除元素的操作时,会产生大量的数据元素移动。

2. 对于长度变化的线性表,要一次性地分配足够的存储空间,但这些空间常常又不到充分的利用。

3.线性表的容量难以扩充。

VC project 练习:

// link_list.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdlib.h>

typedef int ElemType;

typedef struct node {
	ElemType elem;
	struct node* next;
} NODE;

typedef struct {
	NODE *head;
} LINK_LIST;

int init_linklist(LINK_LIST* L)
{
	L->head = (NODE*)malloc(sizeof(NODE));
	if(L->head)
	{
		L->head->next = NULL;
		return 0;
	}
	else
		return 1;
}

void destorylist(LINK_LIST* L)
{
	NODE* p;
	while(L->head)
	{
		p = L->head;
		L->head = L->head->next;
		free(p);
	}
}

int listlength(LINK_LIST* L)
{
	int length = 0;
	NODE* p;

	for(p = L->head; p->next != NULL;p = p->next,length ++);
	return length;

}

int isListEmpty(LINK_LIST* L)
{
	if(L->head->next == NULL)
		return true;
	else
		return false;
}

ElemType getListElem(LINK_LIST* L,int iPosition)
{
	NODE* p;
	int i;

	for(i=0,p=L->head;i != iPosition; i++)
	{
		p = p->next;
	}

	return p->elem;
}

//insert element to the link list at the position of i
void ListInsert(LINK_LIST* L,int iPosition, ElemType elem)
{
	NODE* p,*q;
	int i;

	for(i=0, p=L->head; i < iPosition; p = p->next,i++);
	
	q = (NODE*)malloc(sizeof(NODE));

	q->elem = elem;
	q->next = p->next;
	p->next = q;
	
}

void ListGenerate(LINK_LIST* L)
{
	NODE* p,*q;
	int i;
	
	for(i=0,p = L->head;i<10;i++, p = p->next)
	{
		q = (NODE*)malloc(sizeof(NODE));

		q->elem = i;
		q->next = p->next;
		p->next = q;
	}	
}

int main(int argc, char* argv[])
{
	LINK_LIST* linklist_A;
	int i;
	
	linklist_A = (LINK_LIST*)malloc(sizeof(LINK_LIST));

	init_linklist(linklist_A);

	ListGenerate(linklist_A);

	//print linklist a content
	for(i=1;i<=listlength(linklist_A);i++)
		printf("%d\n",getListElem(linklist_A,i));

	ListInsert(linklist_A,6,200);

	//print linklist a content
	printf("==================== \n");
	for(i=1;i<=listlength(linklist_A);i++)
		printf("%d\n",getListElem(linklist_A,i));	//printf("Hello World!\n");

	system("pause");
	return 0;
}


给定引用内容中未提及全头歌平台上02线性表相关的内容,无法直接从引用里获取这方面资料。不过可依据引用中的线性表知识,推测全头歌平台02线性表可能会涉及的内容。 线性表有逻辑结构和物理结构。逻辑结构方面,线性表属于线性结构,数据元素之间存在一对一的关系;物理结构方面,有顺序存储和链式存储等方式,像数组是顺序存储,指针是链式存储,链式存储又包含单链表、单循环链表、双链表、双循环链表等形式 [^2]。 在线性表的操作上,不同类型链表在插入和删除元素时时间复杂度不同。比如在最后一个元素之后插入元素以及删除第一个元素的操作,单循环链表在插入时和普通单链表一样时间复杂度为O(n),删除第一个元素时因要找尾结点时间复杂度也是O(n);双链表插入操作时间复杂度为O(n),删除第一个元素时间复杂度为O(1);普通链表在最后插入元素时间复杂度为O(n),删除第一个元素时间复杂度为O(1);有尾结点指针的链表插入和删除第一个元素时间复杂度均为O(1) [^1]。 下面给出一个线性表合并函数的示例代码,可能在全头歌平台02线性表相关练习中会用到: ```cpp #include <iostream> #include <vector> // 合并两个有序线性表 void MergeList_L(const std::vector<int>& La, const std::vector<int>& Lb, std::vector<int>& Lc) { int i = 0, j = 0; while (i < La.size() && j < Lb.size()) { if (La[i] <= Lb[j]) { Lc.push_back(La[i]); i++; } else { Lc.push_back(Lb[j]); j++; } } // 将La中剩余元素添加到Lc while (i < La.size()) { Lc.push_back(La[i]); i++; } // 将Lb中剩余元素添加到Lc while (j < Lb.size()) { Lc.push_back(Lb[j]); j++; } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值