C 需要帮助找出链接列表程序给出垃圾值或内存访问错误的原因吗
我是第一次贴海报,所以我不太清楚标准,如果我的格式不好,请原谅 我是C语言编程新手,最近接触了链表,下面的代码是我做链表的拙劣尝试。。我想知道是否有人愿意仔细阅读我的代码,并解释我为什么面临这些问题。提前谢谢!我会尽力回答任何问题 为了解释我的一些职能C 需要帮助找出链接列表程序给出垃圾值或内存访问错误的原因吗,c,debugging,linked-list,C,Debugging,Linked List,我是第一次贴海报,所以我不太清楚标准,如果我的格式不好,请原谅 我是C语言编程新手,最近接触了链表,下面的代码是我做链表的拙劣尝试。。我想知道是否有人愿意仔细阅读我的代码,并解释我为什么面临这些问题。提前谢谢!我会尽力回答任何问题 为了解释我的一些职能 createlinklist:只需初始化结构linklist并添加一个int值 addlinkfirst:在末尾添加一个节点 removelinklast:从末端移除节点 dispalylinklist:打印链接列表的内容 代码: #包括 结构链
#包括
结构链接列表{
int数据;
结构链接列表*链接;
};
void createlinklist(结构链接列表*新列表,int数据){
新建列表->数据=数据;
newlist->link=NULL;
}
void addlinkfirst(结构链接列表*列表,整数数据){
while(列表->链接!=NULL)
列表=列表->链接;
struct linklist*newlist=malloc(sizeof(struct linklist));
newlist->link=NULL;
列表->链接=&newlist;
新建列表->数据=数据;
}
void removelinklast(结构链接列表*列表){
结构链接列表*temp;
while(list!=NULL){
temp=&list;
列表=列表->链接;
}
temp->data=NULL;
temp->link=NULL;
}
无效显示链接列表(结构链接列表*列表){
printf(“\n”);
while(list!=NULL){
printf(“%d-”,列表->数据);
列表=列表->链接;
}
printf(“\n”);
}
int main(){
int x=1,数据,x1;
结构链接列表测试;
而(x!=0){
printf(“按4创建,按1插入,按2删除,按3显示,按0退出\n”);
scanf(“%d”和&x);
//我想你会先选择4,然后选择其他选项
开关(x){
案例4:printf(“\n输入第一个元素的数据:”);scanf(“%d”,&data);createlinklist(&test,data);break;
案例1:printf(“\n输入数据:”);scanf(“%d”,&x1);addlinkfirst(&test,x1);break;
案例2:printf(“\n删除”);removelinklast(&test);break;
案例3:显示链接列表(&T);中断;
案例0:断裂;
默认值:printf(“无效输入重试\n”);
}
}
printf(“\n感谢您使用我的链接列表程序;”);
返回0;
}
在主线中,这一行:
struct linklist test;
在堆栈上创建节点,但不初始化它。它有未定义的数据,最重要的是,链接成员不为NULL。那是个不好的起点
您可能希望从如下指针开始:
struct linklist *test = NULL;
这将表示空列表。要向其中添加元素,请像这样调用addlink:addlink(&test,42)代码>,具有以下实现:
void addlink(struct linklist **p_list, int data) {
if (*p_list == NULL) {
*p_list = makelist(data);
}
else {
addlink(&(*p_list)->link, data);
}
}
struct linklist *makelist(int data) {
struct linklist *list = malloc(sizeof(struct linklist));
list->link = NULL;
list->data = data;
return list;
}
在这里,addlink
是递归的,但是您也可以在不使用递归的情况下轻松地编写它。在makelist
中,创建了一个包含单个元素的列表。我将把removelist
函数留给您作为练习,但它还应该包含一个带有双指针的struct linklist**
参数,您可以这样调用它:removelist(&test)代码>这是否回答了您的问题?
void addlink(struct linklist **p_list, int data) {
if (*p_list == NULL) {
*p_list = makelist(data);
}
else {
addlink(&(*p_list)->link, data);
}
}
struct linklist *makelist(int data) {
struct linklist *list = malloc(sizeof(struct linklist));
list->link = NULL;
list->data = data;
return list;
}