
你这个链表总共有两个节点,最后一个节点的next不是NULL当进行head->next != NULL 的判断的时候还会进入循环里,此时的head->next指向内容可能是非法的,因此引起崩溃。
你下面的for循环只是循环两回,因此就没事,到最后一个节点就不往下执行。
Carry(MT);和void Caculate(link head)有误。
要改成Carry(&MT);和void Caculate(link head);
因为你会在函数内把MT的值改掉,并返回改掉后的值,用link head是无法返回修改后的指针,必须用link head。
如果指针的指针不太好理解,你把link当作int就好理解了。
你好!
上面的程序问题有点多,我帮你修改了一下:
# include <stdioh>
# include <stdlibh>
# include <malloch>
typedef struct pnode
{
int data;
struct pnode next;
}node,list;
node initlist(node head)
{
head=(node)malloc(sizeof(node));
if (NULL == head)
{
printf("分配内存失败!程序终止!");
exit(-1);
}
// head->next=NULL;
return head;
}
node creatlist(list head)
{
node p = head;
p->next = NULL;
// node first = (node)malloc(sizeof(node));
// getchar();
// scanf("%d",first->data);
// printf("输入一些数,按ENTER退出\n");
int i = 0,val;
while(i<5)
{
printf("请输入第%d个节点的有效数据:",i+1);
scanf("%d",&val);
node pNew = (node )malloc(sizeof(node));
if (NULL == pNew)
{
printf("分配内存失败!程序终止!");
exit(-1);
}
pNew->data = val;
p->next = pNew;
pNew->next = NULL;
p = pNew;
i++;
}///
return head;
}
void display(list head)
{
node p = head->next;
while(p->next != NULL)
{
printf("%d->",p->data);//
p = p->next;
}
printf("%d\n",p->data);
}
int main(void)
{
list head1;
head1 = initlist(head1);
head1 = creatlist(head1);
display(head1);
return 0;
}
/
在vc++60中的输出结果:
------------------------
请输入第1个节点的有效数据:1
请输入第2个节点的有效数据:2
请输入第3个节点的有效数据:3
请输入第4个节点的有效数据:4
请输入第5个节点的有效数据:5
1->2->3->4->5
---------------------------
/
仅供参考!呵呵
#include <stdioh>
#include <malloch>
#include <stdlibh>
#define ElemType int
typedef struct Node
{
ElemType data;
struct Node pNext;
}NODE, PNODE;
PNODE create_list(void); //创建带有头结点的链表
void traverse_list(PNODE pHead); //遍历链表
bool is_empty(PNODE pHead); //判断链表是否为空
int length_list(PNODE pHead); //计算链表的长度
bool insert_list(PNODE pHead, int pos, int val); //向链表中制定位置插入数据
bool delete_list(PNODE pHead, int pos, int val); //删除链表中指定位置的数据
void sort_list(PNODE pHead); //对链表进行排序 *** 作
PNODE check_list(PNODE pHead, ElemType value); //依据节点的数据值来查找数据
bool update_list(PNODE pHead, ElemType value1, ElemType value2); //更新数据
int main(void)
{
PNODE pHead = NULL; //等价于struct Node pHead = NULL;
pHead = create_list(); //创建一个非循环链表,并将该链表的头结点的地址赋值给头结点
traverse_list(pHead);
if (is_empty(pHead))
{
printf("链表是空的!\n");
}
else
{
printf("链表不为空!\n");
}
int len;
printf("链表的长度是: %d\n", len = length_list(pHead));
sort_list(pHead);
traverse_list(pHead);
if(insert_list(pHead, 4, 5))
{
printf("数据插入成功!插入后的数据遍历结果为:\n");
traverse_list(pHead);
}
else
{
printf("数据插入失败!原始数据遍历结果为:\n");
traverse_list(pHead);
}
int val;
if(delete_list(pHead, 4, &val))
{
printf("Success -> val is %d\n The result is :\n", val);
traverse_list(pHead);
}
else
{
printf("Faile!\n");
}
//做查询
printf("请输入要查询的数据:\n");
int value, value1;
scanf("%d", &value);
if(NULL != check_list(pHead, value))
printf("链表中存在该数据!\n");
else
printf("链表中不存在该数据!\n");
//下面进行数据更新
printf("请输入被更新的数据及更新后的数据:\n");
scanf("%d %d", &value, &value1);
if(update_list(pHead, value, value1))
printf("The data is updated success!\n");
else
printf("The data is not updated!\n");
//数据更新后重新遍历链表
sort_list(pHead);
return 0;
}
PNODE create_list(void)
{
int len; //有效结点的个数
int i;
int val; //用来存储用户输入的结点的值
printf("请输入您要生成的链表的结点的个数:\n");
scanf("%d", &len);
//先生成一个头结点,然后在下面的for循环中将生成的临时结点链接进来就好了
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if(NULL == pHead)
{
printf("内存分配失败,程序终止!\n");
exit(-1);
}
//pHead->data = len;
//在for循环中进行挂结点的过程是,有一个尾指针pTail,每次创建新结点后,利用pTail->pNext = pNew; pTail = pTail->pNext;
PNODE pTail = pHead;
pTail->pNext = NULL;
for (i=0; i<len; ++i)
{
printf("请输入第%d个结点的数值:", i+1);
scanf("%d", &val);
//数据接收异常处理
char ch;
while((ch=getchar()) != '\n')
continue;
//每循环一次就利用pNew获取一个新地址,并在pNew中存储数据,并将pNew挂到链表中去
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(NULL == pNew)
{
printf("分配失败,程序终止!\n");
exit(-1);
}
if(val == pTail->data)
{
printf("是否输入错误,本次输入数据与前者相同,请确认(如果正确输入Y,否则输入N):");
ch=getchar();
// printf("%c\n", ch);
if (ch =='N' || ch == 'n')
{
i--;
continue;
}
}
//利用尾指针进行挂结点的过程
printf("%d\n", val);
pNew->data = val;
pTail->pNext = pNew;
pTail = pNew;
pTail->pNext = NULL;
}
return pHead;
}
void traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext; //这里一定要注意p是指pHead的指针域的值,而不是pHead后面的那个结点
while(NULL != p)
{
printf("%d\t", p->data);
p = p->pNext;
}
printf("\n");
return;
}
bool is_empty(PNODE pHead)
{
if(NULL == pHead->pNext)
return true;
else
return false;
}
int length_list(PNODE pHead)
{
int len = 0;
PNODE p = pHead->pNext;
//printf("")
while(NULL != p)
{
len++;
p = p->pNext;
}
return len;
}
//在pHead所指链表的第pos个结点的前面插入一个新的结点,并且该结点的值是val;pos从1开始
bool insert_list(PNODE pHead, int pos, int val)
{
int i = 0; //用于统计链表中结点的个数,最终也就得到了链表的长度
PNODE p = pHead;
while(NULL != p && i < pos-1) //标识指针还有后续结点,并且i的数值要比pos小1
{
p = p->pNext;
++i;
}
//上面的循环中首先是i=0的时候,如果链表为空或者i>=pos-1(说明pos<=0)就直接往下走了,然后if成立,则退出程序;
//如果刚进入程序的时候没有退出,则说明pos是正数并且链表不为空。进去开始循环并利用i统计链表的长度,如果p=NULL先成立则说明pos数据过大;
//i永远不会大于pos,最好的情形就是碰到p=null,使得指针找到了要插入数据位置的前驱结点,方便后面进行插入
if(i>pos-1 || NULL==p)
return false;
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(NULL == pNew)
{
printf("动态内存分配失败!\n");
exit(-1);
}
pNew->data = val;
PNODE q = p->pNext;
p->pNext = pNew;
pNew->pNext = q;
return true;
}
bool delete_list(PNODE pHead, int pos, int pVal)
{
int i = 0; //用于统计链表中结点的个数,最终也就得到了链表的长度
PNODE p = pHead;
while(NULL != p && i < pos-1) //标识指针还有后续结点,并且i的数值要比pos小1
{
p = p->pNext;
++i;
}
//上面的while循环最大可能就是造成 i=pos-1 或者 NULL= p
//如果i>pos-1则表示前面的while是由于NULL=p造成的,也就是说链表的长度要小于
if(i>pos-1 || NULL==p)
return false;
PNODE q = p->pNext;
pVal = q->data;
p->pNext = p->pNext->pNext;
free(q);
q = NULL;
return true;
}
//不改变链表的指向,而是交换各个结点的数值
void sort_list(PNODE pHead) //非常的重要
{
int i, j, tmp, len = length_list(pHead);
PNODE p, q;
for(i=0,p=pHead->pNext; i<len-1; ++i,p=p->pNext)
{
for(j=i+1,q=p->pNext; j<len; ++j,q=q->pNext)
{
if(p->data > q->data)
{
tmp = p->data;
p->data = q->data;
q->data = tmp;
}
}
}
return;
}
PNODE check_list(PNODE pHead, ElemType value)
{
PNODE p;
while(pHead->pNext != NULL)
{
pHead = pHead->pNext;
if(pHead->data == value)
{
p = pHead;
return p;
}
}
return p;
}
bool update_list(PNODE pHead, ElemType value1, ElemType value2)
{
PNODE p = check_list(pHead, value1);
if(NULL == p)
{
return false;
}
else
{
p->data = value2;
}
return true;
}
这个是一个还算完整的链表 *** 作的例子,有些功能是以前写的
你看看吧,应该符合你的要求
刚才忘记添加链表的销毁了
void destroy(PNODE pHead)
{
PNODE tmp = pHead;
while(pHead->pNext != NULL)
{
tmp = pHead;
pHead = pHead->pNext;
free(tmp);
}
}
记得在前面进行函数声明
如果可以的话就采纳吧,嘿嘿
没有缩进,读的我头晕脑胀
while(scanf("%d",&n),n!=-1),为什么不写成scanf("%d",&n);while(n!=-1)
我在想如果链表长度是1,会不会有问题?
你好像不会调试程序,比如单步运行等等。你也可以在代码中,临时加入输出语句,监视数据的状态?
不想费那么大劲去读你的代码。。。
while中的 printf("请输入学生的学号姓名和成绩:");应为printf("请输入学生的学号姓名和成绩:",n+1);掉了n+1,其实对程序没有影响,只是为了提示当前输入的是第几条记录。。
#include<stdioh>
#include<stdlibh>
#include<stringh>
#include<malloch>
#define LEN sizeof(struct stu)
struct stu create(); // 创建链表
void print(struct stu head); // 打印链表
struct stu
{
char name[20];
int age;
struct stu toNext;
};
main()
{
struct stu temp;
temp = create();
printf("============================\n");
print(temp);
system("pause");
}
struct stu create() //类似 int main(), struct stu 类似int create()类似main()
{
struct stu head, last, next;
head = (struct stu )malloc(LEN);
printf("请输入名字:\n");
scanf("%s", &head->name);
printf("请输入年龄:\n");
scanf("%d%c", &head->age);
last = next = head;
while(last->age)
{
next = (struct stu )malloc(LEN);
printf("请输入名字:\n");
scanf("%s", &next->name);
printf("请输入年龄:\n");
scanf("%d", &next->age);
last->toNext = next->age == 0 NULL : next;
last = next;
}
return head;
}
void print(struct stu head)
{
struct stu p;
p = head;
do
{
printf("--OK--\n");
printf("名字:%s年龄:%d\n", p->name, p->age);
p = p->toNext;
}while(p);
}
以上就是关于链表的程序崩溃了全部的内容,包括:链表的程序崩溃了、编程C++计算2^1000这个数的每位相加所得的值,用链表法,但是显示程序停止工作,各位大神可以看看、这个链表程序错在哪啊!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)