链表《Link》

链表(Link)

使用线性表的不足之处:

1.如果长度不确定,使用线性表时,会很不方便,运算效率比较低。

2.在线性表时,插入和删除一个数时,要移动大量的数据,会造成效率低下。

3.当为一个线性表分配存储空间时,如果存储空间满的话,再次插入数据的话,会造成“上溢”错误。

这上面的三个不足,在链表中都可以得到解决。

 

在链式存储方式中,要求每个节点由两部分组成:一部分用于存放数据元素值,成为数据域;一部分用于存放指针,称为指针域。

 

 

在线性链表中,用一个专门的指针head指向线性链表的第一个元素的节点(即存放线性表中第一个数据元素的存储的存储点的序号),线性链表的最后一个节点的指针域为空。

 

线性链表的插入:

1.利用栈取一个节点,设该节点号为P,在P节点中的数据域中插入元素为bV(p) = b;

2.在链表中寻找包含元素为x的前一个节点,设该节点的序号为q

3.将节点P插入节点q之后;

4.使节点P指向包含元素x的节点,即NEXTp= NEXTq);

5.使节点q的指针域内容改为指向节点p,即NEXTq=p

6.插入完成


 

线性链表的删除:

1.在线性链表中找到包含元素X的前一个节点,设该节点的序号为q,则包含元素的节点序号为:p=NEXTq);

2.将节点q后的节点p从线性表中删除,即让节点q的指针指向包含元素X的节点p的指针指向的节点,即NEXTq=NEXTp);

3.删除完成。

 

代码:

#include<iostream>

using namespace std;

 

template<class Type>

struct node

{

Type d;

node *next;

};

 

template<class Type>

class link

{

public:

link();

void prt_link();

void ins_link(Type,Type);

Type del_link(Type);

private:

node<Type>*head;

};

 

template<class Type>

link<Type>::link()

{

head = NULL;

return ;

}

 

template<class Type>

void link<Type>::prt_link()

{

node<Type> *p;

p = head;

if(p == NULL)

{

cout<<"Empty!"<<endl;

}

/* while(p != NULL)

{

cout<<p->d<<endl;

p=p->next;

}

*/

do{

 cout<<p->d<<endl;

 p=p->next;

 

}while(p != NULL);

return ;

}

 

template<class Type>

void link<Type>::ins_link(Type x,Type b)

{

node<Type>*p,*q;

p = new node<Type>;

p->d = b;

if(head == NULL)

{

head = p ;

p->next = NULL;

}

if(head->d == x)

{

p->next = head;

head = p;

}

q = head;

while((q->next != NULL)&&(((q->next)->d) != x))

{

q = q->next;

p->next = q->next;

q->next = p;

}

}

 

template<class Type>

Type link<Type>::del_link(Type x)

{

node<Type>*p,*q;

if(head == NULL)

{

cout<<"ERROR"<<endl;

return 0;

}

if((head->d) == x)

{

p = head->next;

delete head;

head=p;

return 1;

}

q = head;

while((q->next != NULL)&&(((q->next)->d) != x))

q= q->next;

if(q->next == NULL)

{

return 0;

}

p = q->next;

q->next = p->next;

delete p;  

return 1;

}

#include"link.h"

 

int main()

{

link<int>s;

s.prt_link();

s.ins_link(10,10);

s.ins_link(10,30);

s.prt_link();

s.ins_link(10,40);

s.ins_link(10,50);

s.ins_link(10,60);

s.prt_link();

// s.del_link(50);

// s.prt_link();

}

 

 

#include <stdio.h> #include<stdlib.h> //第一步 定义单链表结构体 struct link_node { struct link_node *next; // 链表的指针指向下一个链表元素 int data; // 存放链表的数据 }; // 第二步 尾插法创建链表 link_node *create_LinkList() //定义一个返回类型为链表的函数来创建链表 { int num,temp,i=1; link_node *head, *p, *q; // 定义好头指针,和q p指针 head=p=(link_node *)malloc(sizeof(link_node)); // 为p和head开辟空间来创建节点,并让p指针指向头 p->next=NULL; // 创建单链表的表头结点head //一开始 head节点后面没有其他节点,所以 向空 printf("输入链表长度"); scanf("%d",&num); while (num--) // 循环输入链表的值 ,利用尾插法增加元素 { printf("输入链表的第个%d值:",i++); scanf("%d",&temp);//输入值存放在temp中 q = (link_node *)malloc(sizeof(link_node)); //为q开辟空间来创建新节点 q->data=temp; // 把输入的temp的值给到 q q->next=p->next; // 让q指向 p的下一个,实现尾插 p->next=q; // 让p指向q p=q; /*钩链,新创建的结点总是作为最后一个结点*/ } return head; } // 第三步 删除重复元素 struct link_node* deleteDuplicates(struct link_node* head) { if (!head) { // 边界判断 return head; } struct link_node* p ,*s; struct link_node* q ; p = head->next; //p指向头节点 while(p) { // 外层循环p ,内层循环每次判断q和p是否相同,q每次后移 //一开始 p q 指向一起 // 判断是否存在q的下一个元 // 然后判断p是不是和他的下一个元素相同 // 如果相同 则断开链表,让q跳过一个元素指向q的下一个的下一个 // 如果不相等,那么 q指针 指向下一位继续判断 //判断完当前i的最后所有的值了之后,继续判断i的下一位 } return head; } int main() { struct link_node *head,*p,*q; // 定义单链表 head = create_LinkList(); // 调用创建函数 deleteDuplicates(head); // 调用删除函数去掉重复 p=head->next; // 让p指向头节点,为循环打印做准备 while(p!=NULL) // 如果p不为假 { printf("%d ",p->data); // 打印p的data值 p=p->next; // 指针往后挪 } return 0; }
最新发布
10-12
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值