数据结构基础——链表
2018-02-27 09:26
204 查看
链表的优缺点: 优点: 空间没有限制 插入删除元素很快 缺点: 存取速度很慢。
定义: n个节点离散分配(在内存中不是连续存储) 彼此通过指针相连 每个节点只有一个前驱节点,每个节点只有一个后续节点 首节点没有前驱节点,尾节点没有后续节点。 首节点: 第一个有效节点 尾节点: 最后一个有效节点 头节点: 头结点的数据类型和首节点的类型一样 没有存放有效数据,最最前面的,是在 首节点之前的,主要是为了方便对链表 的操作。 头指针:(指向头) 指向头节点的指针变量 尾指针: 指向尾节点的指针 (头结点有可能很大,占的内存可能大,假设我想造一个函数输出所有链表的值,那你如果不用头指针类型做形参,那由于不同链表的头节点不一样大小,这样就没办法找出形参) **确定一个链表需要几个参数:(或者说如果期望一个函数对链表进行操作 我们至少需要接收链表的那些信息???) 只需要一个参数:头指针,因为通过它我们可以推出 链表的所有信息。(链表的程序最好一定要自己敲出来) 链表的分类:单链表 双链表: 每一个节点有两个指针域 循环链表 能通过任何一个节点找到其他所有的节点 单链表伪算法:1.插入节点:在p指向的节点后面插入一个被q指向的节点: P存放的是指向的节点的地址,q也是。next指针存放的是下一个元素的地址。 q->next=p->next;p->next=q;也可以r=p->next; p->next=q;q->next=r; 删除p后面的节点 P->next=p->next->next 会造成内存泄露,无法找到要删除的节点,无法释放内存。正确做法:临时定义一个指针r 存放要删除节点的地址r=p->next;p->next=p->next->next;free(r);//释放所指节点占用的内存
---------------------------分割线-------------------------------------------------------------------------------------下面自己写的代码实现(c/c++):#include <iostream>
using namespace std;
typedef struct chain_arry
{
int num;
struct chain_arry *next;
}chain;
chain *create(int num)
{
chain *phead = (chain *)malloc(sizeof(chain));
chain *ptemp = (chain *)malloc(sizeof(chain));
ptemp = phead;
for (int i = 0; i < num; i++)
{
chain *pnew = (chain *)malloc(sizeof(chain));
cout <<"请输入第"<<i+1<<"个链表的值"<< endl;
cin >> pnew->num;
pnew->next = NULL;
ptemp->next = pnew;
ptemp = pnew;
}
return phead;
}
bool isEmpty(chain *phead)
{
if (phead->next == NULL)
{
return true;
}
else
{
return false;
}
}
void bianli(chain *phead)
{
chain *p = phead;
while (p->next != NULL)
{
p = p->next;
cout <<p->num<< endl;
}
}
chain *insert(chain *phead, int num, int pos)
{
chain *p = (chain *)malloc(sizeof(chain));
p = phead;
for (int i = 0; i < pos-1; i++)
{
p = p->next;
}
chain *pnew = (chain *)malloc(sizeof(chain));
chain *temp = p->next;
pnew->num = num;
pnew->next = temp;
p->next = pnew;
return phead;
}
chain *del(chain *phead, int pos)
{
chain *p = (chain *)malloc(sizeof(chain));
p = phead;
for (int i = 0; i < pos - 1; i++)
{
p = p->next;
}
chain *temp = p->next;
p->next = p->next->next;
free(temp);
return phead;
}
int main()
{
chain *phead = create(5);
//bool b=isEmpty(phead);
//cout <<b<< endl;
phead=insert(phead, 5, 3);
phead = del(phead, 3);
bianli(phead);
}
定义: n个节点离散分配(在内存中不是连续存储) 彼此通过指针相连 每个节点只有一个前驱节点,每个节点只有一个后续节点 首节点没有前驱节点,尾节点没有后续节点。 首节点: 第一个有效节点 尾节点: 最后一个有效节点 头节点: 头结点的数据类型和首节点的类型一样 没有存放有效数据,最最前面的,是在 首节点之前的,主要是为了方便对链表 的操作。 头指针:(指向头) 指向头节点的指针变量 尾指针: 指向尾节点的指针 (头结点有可能很大,占的内存可能大,假设我想造一个函数输出所有链表的值,那你如果不用头指针类型做形参,那由于不同链表的头节点不一样大小,这样就没办法找出形参) **确定一个链表需要几个参数:(或者说如果期望一个函数对链表进行操作 我们至少需要接收链表的那些信息???) 只需要一个参数:头指针,因为通过它我们可以推出 链表的所有信息。(链表的程序最好一定要自己敲出来) 链表的分类:单链表 双链表: 每一个节点有两个指针域 循环链表 能通过任何一个节点找到其他所有的节点 单链表伪算法:1.插入节点:在p指向的节点后面插入一个被q指向的节点: P存放的是指向的节点的地址,q也是。next指针存放的是下一个元素的地址。 q->next=p->next;p->next=q;也可以r=p->next; p->next=q;q->next=r; 删除p后面的节点 P->next=p->next->next 会造成内存泄露,无法找到要删除的节点,无法释放内存。正确做法:临时定义一个指针r 存放要删除节点的地址r=p->next;p->next=p->next->next;free(r);//释放所指节点占用的内存
---------------------------分割线-------------------------------------------------------------------------------------下面自己写的代码实现(c/c++):#include <iostream>
using namespace std;
typedef struct chain_arry
{
int num;
struct chain_arry *next;
}chain;
chain *create(int num)
{
chain *phead = (chain *)malloc(sizeof(chain));
chain *ptemp = (chain *)malloc(sizeof(chain));
ptemp = phead;
for (int i = 0; i < num; i++)
{
chain *pnew = (chain *)malloc(sizeof(chain));
cout <<"请输入第"<<i+1<<"个链表的值"<< endl;
cin >> pnew->num;
pnew->next = NULL;
ptemp->next = pnew;
ptemp = pnew;
}
return phead;
}
bool isEmpty(chain *phead)
{
if (phead->next == NULL)
{
return true;
}
else
{
return false;
}
}
void bianli(chain *phead)
{
chain *p = phead;
while (p->next != NULL)
{
p = p->next;
cout <<p->num<< endl;
}
}
chain *insert(chain *phead, int num, int pos)
{
chain *p = (chain *)malloc(sizeof(chain));
p = phead;
for (int i = 0; i < pos-1; i++)
{
p = p->next;
}
chain *pnew = (chain *)malloc(sizeof(chain));
chain *temp = p->next;
pnew->num = num;
pnew->next = temp;
p->next = pnew;
return phead;
}
chain *del(chain *phead, int pos)
{
chain *p = (chain *)malloc(sizeof(chain));
p = phead;
for (int i = 0; i < pos - 1; i++)
{
p = p->next;
}
chain *temp = p->next;
p->next = p->next->next;
free(temp);
return phead;
}
int main()
{
chain *phead = create(5);
//bool b=isEmpty(phead);
//cout <<b<< endl;
phead=insert(phead, 5, 3);
phead = del(phead, 3);
bianli(phead);
}
相关文章推荐
- 数据结构基础PTA 6-1 单链表逆转
- php学习第一章:PHP基础语法(三)数据结构与算法:2、单向链表
- 数据结构——单链表的创建、逆置、插入、有序表的建立、有序单链表合并等基础操作!!
- 数据结构基础(12) --双向循环链表的设计与实现
- 【数据结构基础】线性表的链式存储结构--单链表
- 【数据结构与算法基础】单链表及其应用基数排序 / Singly Linked List and radix sort
- PJLIB库基础框架-数据结构之循环链表的使用
- 数据结构基础_逆向输出链表
- 数据结构基础(12) --双向循环链表的设计与实现
- 数据结构基础 链表的插入排序程序
- 数据结构基础(4)顺序表.链表.栈
- 【程序员面试宝典】数据结构基础二单链表循环链表的操作 建立|插入删除|打印|合并
- 基础数据结构——单链表
- 数据结构基础(12) --双向循环链表的设计与实现
- 数据结构基础 - 链表的遍历 zz
- 基础数据结构:顺序表、链表——Python实现
- 数据结构基础三-----之模块一《离散存储【链表】》
- 【学习笔记】数据结构与算法基础学习:链表
- Hrbust-1546-基础数据结构——单链表(1)【链表实现】
- 数据结构基础(2)---链表基础概念