导航:首页 > 源码编译 > 后插法创建单链表算法

后插法创建单链表算法

发布时间:2022-06-30 22:01:03

1. 创建一个带头结点的单链表,分别用前插法和后插法创建单链表。这个怎么弄

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
int val;
struct node *next;
}NODE;

NODE *create_linklist(int len,int *a)
{
int i;
NODE *p = (NODE *)malloc(sizeof(NODE));
NODE *head = p;
NODE *q = NULL;

for (i = 0; i < len; ++i){
q = (NODE *)malloc(sizeof(NODE));
q->val = *(a+i);
p->next = q;
p = q;
}
p->next = NULL;

return head;
}

NODE *find_in_linklist(NODE *pnode,int val)
{
NODE *p = NULL;
if (!pnode->next){
return NULL;
}

p = pnode->next;
while(p){
if(val == p->val){
return p;
}
p = p->next;
}

return NULL;
}

int delete_node(NODE *pnode,NODE *pdel)
{
NODE *p = pnode->next;
NODE *q = pnode;

while(p){
if (p == pdel){
q->next = p->next;
free(p);
return 1;
}
p = p->next;
q = q->next;
}

return 0;
}

void print_linklist(NODE *pnode){
NODE *p = pnode->next;

while(p){
printf("%d ", p->val);
p = p->next;
}
printf("\n");
}

int main(int argc, char const *argv[])
{
/* code */
int a[] = {1,2,3,5};
NODE *p = create_linklist(4,a);
NODE *q = find_in_linklist(p,2);

print_linklist(p);

if(q){
if(delete_node(p,q)){
printf("delete successful!\n");
}
else{
printf("delete failed!\n");
}
}

print_linklist(p);
return 0;
}

2. 建立单链表的尾插法的编程思路是什么

建立链表时不仅使用头指针,还要另外使用一个尾结点指针,每次插入的结点成为当前尾结点的后继结点(也就是成为新表尾结点),并且尾结点指针也要后移,指向新插入的尾结点
其实链队列就是这样插入(入队)的

3. 从表头插入节点建立单链表的算法如何写

何在指针q指向的结点后面插入结点。该过程的步骤如下:
(1)先创建一个新结点,并用指针p指向该结点。
(2)将q指向的结点的next域的值(即q的后继结点的指针)赋值给p指向结点的next域。
(3)将p的值赋值给q的next域。
通过以上3步就可以实现在链表中由指针q指向的结点后面插入p所指向的结点。可以通过图1-5形象地展示出这一过程。
图1-5
向链表插入结点过程
下面给出代码描述:
1.void
insertList(LinkList
*list,LinkList
q,ElemType
e)
/*当链表为空时*/
10.
else
16.}
上面的这段代码描述了如何在指针q指向的结点后面插入结点的过程。其过程包括以下几步。
(1)首先生成一个新的结点,大小为sizeof(LNode),用LinkList类型的变量p指向该结点。将该结点的数据域赋值为e。
(2)接下来判断链表是否为空。如果链表为空,则将p赋值给list,p的next域的值置为空。否则,将q指向的结点的next域的值赋值给p指向结点的next域,这样p指向的结点就与q指向结点的下一个结点连接到了一起。
(3)然后再将p的值赋值给q所指结点的next域,这样就将p指向的结点插入到了指针q指向结点的后面。
其实通过上面这段算法描述可以看出,应用这个算法同样可以创建一个链表。这是因为当最开始时链表为空,即list==NULL,该算法可自动为链表创建一个结点。在下面的创建其他结点的过程中,只要始终将指针q指向链表的最后一个结点,就可以创建出一个
链表。
注意:函数insertList()的参数中有一个LinkList
*list,它是指向LinkList类型的指针变量,相当于指向LNode类型的指针的指针。这是因为在函数中要对list,也就是表头指针进行修改,而调用该函数时,实参是&list,而不是list。因此必须采取指针参数传递的办法,否则无法在被调函数中修改主函数中定义的变量的内容。以下的代码也有类似的情况。

4. 如何创建单链表

建立单链表的常用方法有两种:头插法建表、尾插法建表

5. 尾插法建立单链表问题,c/c++

首先,r和head都是ListNode对象,你调用r=head的时候,实际上是调用了ListNode的默认复制构造函数,此时默认复制构造函数仅仅作一个指针值的复制,并没有重新分配内存空间,也就是说,r此时并没有用malloc申请空间,r和head指向同一地址空间,此后,你在r之后插入新节点,比如插入第一个节点,这个节点是跟在r之后的,但r又和head同一指向,也就是相当在head后面插入一个节点,之后,r移向新插入的节点上,而head不变,仍然指向刚开始的地方(此时head后面已经有一个节点了),实际上r就是一个跟踪指针,为了建立链表后,你能够获得该链表的首地址,你必须保存head的值,也就是说不能改变head的值!如果不明白,你也可以找些有关“深复制”和“浅复制”的书看看!(面向对象构造函数应该会讲到)

6. 尾插法建立两个单链表,并设计算法将两个链表合并(C++语言)

建立一个链表:
[code=#include<iostream.h>

struct link

{ int data; //元素类型

link *next; //指针类型,存放下一个元素地址

};

link *rcreat( )//尾插法建立链表

{

link *s,*r,*p;

int i;

p=r=new link;

p->next=NULL;

cin>>i;

while(i)

{ s=new link;

s->data=i;

r->next=s;
r=s;
cin>>i;

}

r->next=NULL;

return p;

}C/C++][/code]

7. 用尾插法生成一个带头结点的单链表

首先,你是C还是C++语言,决定你用malloc函数还是new运算符来动态开辟结点。
其次,要设置指针,p1作为新开辟结点,p2指向尾结点。每次开辟一个新节点,就让当前尾结点的next域指向新结点,新结点的next置空,然后让p2重新定位到p1位置,新结点作为尾结点。这是尾插法建表。
再次,如果查找Key值,
k ←key;
for (p3=head;p3!=p2;p3++)
if p3→key == k
then ....↓....

注意,这里找到结点了,就要先把此结点前驱的尾指针指向此节点的后继,然后free或者delete就可以了,你如果想要具体的源代码,那么请参考

C程序设计,第四版,清华大学出版社,谭浩强,习题解答小册上,第十二章结构体和共同体中,关于链表的简单4个操作,
或者是C++程序设计,清华大学出版社,谭浩强,第八章面向过程程序设计,习题解答小册上也有C++版本的单链表处理。

如果你要能编译的源代码来交作业,请查阅上述两本书,绝对有。
如果你是为了学好C或者C++,请认真打扎实基本功。

8. 尾插法建立单链表时遇到的的问题

没看出来这两个算法之间有什么大的区别
主要区别就是 LNode* 类型变量 s 的声明位置

方法一是在函数首部声明,生命周期是从函数调用开始到函数返回位置
方法二是在for循环内部声明,生命周期是在for循环的循环体内部,要说效率看起来好像低了点,因为好像每次循环都要为他分配空间.

9. 如何C语言创建单链表

C语言创建单链表如下:

#include"stdio.h"

#include"stdlib.h"

#include"malloc.h"

#include "iostream.h"

typedef struct node

{

intdata;

node * next;

}node , * List;

void create(int n)

{

int c;

List s,L;

L=(List)malloc(sizeof(node));

L->next=NULL;

printf("请输入第1个数据:");

scanf("%d",&c);

L->data=c;

for(int i=2;i<=n;i++)

{

s=(List)malloc(sizeof(node));

printf("请输入第%d个数据:",i);

scanf("%d",&c);

s->data=c;

s->next=L;

L->next =s;

}

printf("链表创建成功!");

}

void main()

{

int n;

printf("请你输入链表的个数:");

scanf("%d",&n);

create(n);

}

10. 数据结构单链表的建立(后插法)

new(head)
head->next=NULL
tail=head
while (read(x)!=EOF)
{
new(a)
a->value=x
tail->next=a
a->next=NULL
tail=a
}

大概如此。

阅读全文

与后插法创建单链表算法相关的资料

热点内容
我的世界命令方块该怎么拿 浏览:780
浙江容错服务器厂家云空间 浏览:194
linuxpython3idle 浏览:739
程序员成就感从哪来 浏览:545
游资抄底源码公式 浏览:802
用VF命令 浏览:948
解压速度14m 浏览:329
php获取httpheader 浏览:297
什么软件可以修改pdf文件 浏览:867
命令行截图软件 浏览:734
程序员加班多 浏览:123
android设置view的背景 浏览:684
u盘加密工具哪个好 浏览:571
php生成html模板引擎 浏览:26
如何设置app封杀 浏览:823
手机将照片弄成压缩包 浏览:221
卡联购卡盟官网源码 浏览:867
网页弄成pdf 浏览:223
dos的删除命令 浏览:309
区块链的加密物联网传输 浏览:572