C语言 需要帮助找出为什么 LinkList 程序给出垃圾值或内存访问错误



我是第一次发海报,所以我并不完全了解规范,如果我的格式不好,请原谅我。

我是 C 编程的新手,最近在链表上学习,下面的代码是我制作一个的蹩脚尝试。我想知道是否有人愿意浏览我的代码并解释为什么我面临问题。提前感谢!我会尽力回答任何问题!

为了解释我的一些功能,

创建链接列表
  1. :只需初始化结构链接列表并添加一个 int 值
  2. 添加链接优先:在末尾添加一个节点
  3. 删除链接最后:从末尾删除节点
  4. 分散链接列表
  5. :打印链接列表的内容

法典:

#include<stdio.h>
struct linklist {
int data;
struct linklist* link;
};
void createlinklist (struct linklist* newlist, int data){
newlist->data = data;
newlist->link = NULL;
}
void addlinkfirst (struct linklist* list, int data){
while(list->link != NULL)
list = list->link;
struct linklist *newlist = malloc(sizeof(struct linklist));
newlist->link = NULL;
list->link = &newlist;
newlist->data = data;
}
void removelinklast (struct linklist* list){
struct linklist* temp;
while(list != NULL){
temp = &list;
list = list-> link;
}
temp->data = NULL;
temp->link = NULL;
}
void displaylinklist (struct linklist* list) {
printf("n");
while(list != NULL){
printf(" %d-",list->data);
list = list->link;
}
printf("n");
}
int main () {
int x = 1, data, x1;
struct linklist test;
while(x!=0){
printf("Press 4 to create, Press 1 insert, Press 2 delete, Press 3 Display, Press 0 to Exit n");
scanf("%d",&x);
//i assume you will be choosing 4 first then the other options 
switch(x){
case 4: printf("nEnter data for the first element:"); scanf("%d",&data); createlinklist(&test,data); break;
case 1: printf("nEnter data:"); scanf("%d",&x1); addlinkfirst(&test,x1); break;
case 2: printf("nDeleted"); removelinklast(&test); break;
case 3: displaylinklist(&test); break;
case 0: break;
default: printf("Invalid Input Try againn");
}
}
printf("nThank you for using my linklist program;");
return 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是递归的,但你也可以轻松地编写它,而无需 reuration。在makelist中,创建了一个包含单个元素的列表。我将把removelist函数留给你作为一个练习,但它也应该需要一个struct linklist **的论证,用双指针,你会这样称呼它:removelist(&test);

相关内容

  • 没有找到相关文章

最新更新