重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
加分了
创新互联公司是专业的遵义网站建设公司,遵义接单;提供成都做网站、成都网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行遵义网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
#includestdio.h
#includestdlib.h
class point //节点类
{
public:
int a; //节点值
point *next; //next指针
};
void newlast(point *p,int i) //在*p所指的链表的最后新建一个值为i的节点
{
point *q,*o;
q=p;
while(q-next)
{
q=q-next;
}
printf("%d\n",q-a);
o=(point *)malloc(sizeof(point));
o-a=i;
q-next=o;
o-next=NULL; //结束标记
}
void show(point *p) //输出指针p所指链表
{
point *q;
q=p;
while(q)
{
printf("%d\t",q-a);
q=q-next;
}
printf("\n");
}
int main()
{
point b1,b2,b3;
point *p;
b1.a=1;
b2.a=2;
b3.a=3;
p=b1;
b1.next=b2;
b2.next=b3;
b3.next=NULL; //结束标记
show(p);
newlast(p,4);
show(p);
return 0;
}
这个程序有两个主要问题
1. void insert(list*pHead,list*pNode)因为是按值传递的 pHead值,所以不能改变pHead的值,改为按地址传递,list** pHead
2. insert()中,第一,二种情况时,没有组成循环链表的闭环(没有更新尾节点的next为新的head)。修改后的程序如下:
#includestdio.h //预编译命令
struct list//定义结构体
{
int num;
list* next;
};
list *head,*end; //定义全局变量
list* creat()//创建链表的函数
{
list* p=NULL;
list* q=NULL;
head=NULL;
int num;
scanf("%d",num);
while(num!=0)
{
p=new list; //开辟空间
p-num=num;
if(head==NULL)
head=p;
else
q-next=p;
q=p;
scanf("%d",num);
}
end=q; //将链表的结尾最后一个结点赋给end
end-next=head; //让最后一个结点的的下个结点的地址不为空而指向头指针
return(head);
}
void insert( list** pHead,list* pNode) //插入接点的函数,
{
list *q,*r;
//第一种情况,链表为空
if(*pHead==NULL)
{
*pHead=pNode; //链表头指向pNode
(*pHead)-next = *pHead;//为了循环用
return; //完成插入操作,返回
}
//第二种情况,pNode结点num的值小于dengyu链表头结点num的值
//则将pNode的值插到链表头部
if(pNode-num=(*pHead)-num)
{
//这是为了更新最后一个端点与头节点的连接
list* pos = *pHead;
while (pos-next != *pHead)
{
pos = pos-next;
}
pos-next = pNode;
pNode-next= (*pHead);
*pHead=pNode;
return;
}
//第三种情况,循环查找正确位置
r=*pHead;
q=(*pHead)-next;
while(q!=*pHead)
{
if(pNode-numq-num)
{
r=q;
q=q-next;
}
else
break;
}
//如果插入到最后的位置,则更新pEnd的值
r-next=pNode;
pNode-next=q;
}
list* together(list* p1,list* p2) //定义两个链表合并的函数
{
list *q,*r;
q=p2;
do
{
r=new list; //开辟空间
r-num=q-num; //将q的值赋给r
insert(p1,r); //调用插入结点的函数
q=q-next; //指针向后拨一个接点
}while(q!=p2); //当在最后一个结点时停止循环
return(p1); //返回头指针
}
void main() //主函数
{
list *list1,*list2,*r,*q;
list1=creat(); //调用创建链表的函数
list2=creat(); //调用创建链表的函数
r=together(list1,list2); //调用合并两个链表的函数
q=r-next;
for(;q!=r;q=q-next)
printf("%d ",q-num);
}
struct link *AppendNode(struct link *head) {//这里默认head为链表的头结点
int a;
struct link *p = NULL,*pr = head;
p = (struct link*)malloc(sizeof(struct link)); //p指向新建节点
if(head == NULL) head = p;//因为head == NULL,所以表是空的,故头结点head指向新结点
else {
while(pr-next != NULL) {//前进到链表的尾节点
pr = pr-next;
}
pr-next = p;//新结点链到链表的尾部
}
printf("input data:");
scanf("%d",a);
p-data = a;
p-next = NULL;
return head;
}
首先,主函数中,“请输入插入的数据”那里scanf应该是b,这是引发崩溃的原因。
其次,insert函数的目的应该是想插入数据后仍是有序链表。但你的insert函数逻辑太乱,有些不必要的判断,我修正了你的代码,贴给你看看。(虽然你insert是想保证有序,但你在创建的时候没有保证有序,所以最终结果不一定是有序。例如,创建 1,5,2,插入3,最后输出的是 1,3,5,2)
代码修改:
scanf("%d", b);
重写了insert函数,简化逻辑;
动态分配的内存记得释放,增加freeNode释放空间
#include stdio.h
#include stdlib.h
struct link
{
int data;
struct link *next;
};
struct link *add(struct link *head);//创建链表
void display(struct link *head);//输出数据
struct link *insert(struct link *head, int b); //插入新节点
void freeNode(struct link *); //释放空间
int main()
{
char c;
struct link *head = NULL;
printf("要创建一个链表吗?");
scanf(" %c", c);
while (c == 'y' || c == 'Y')
{
head = add(head);
printf("要继续创建节点吗?");
scanf(" %c", c);
}
display(head);
int b;
printf("输入插入的数据");
scanf("%d", b);
head = insert(head, b);
display(head);
freeNode(head);
}
struct link *add(struct link *head)
{
int data;
struct link *p = (struct link*)malloc(sizeof(struct link));
if (head == NULL)
{
head = p;
}
else
{
struct link *pr = head;//一个临时指针pr先保存下head的地址
while (pr-next != NULL)
{
pr = pr-next;
}
pr-next = p;
}
printf("输入数据");
scanf("%d", p-data);
p-next = NULL;
return head;
}
void display(struct link *head)
{
struct link *pr = head;
while (pr != NULL)
{
printf("%d\n", pr-data);
pr = pr-next;
}
}
struct link *insert(struct link *head, int b)
{
struct link *ptr = head, *prev = head;
struct link *newNode = (struct link *)malloc(sizeof(struct link));
newNode-data = b;
while (ptr b ptr-data) {
prev = ptr;
ptr = ptr-next;
}
newNode-next = ptr;
if (ptr == head) head = newNode;
else prev-next = newNode;
return head;
}
void freeNode(struct link *node) {
if (!node) return;
freeNode(node-next);
free(node);
}