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
}
大概如此。