我是第一次发海报,所以我并不完全了解规范,如果我的格式不好,请原谅我。
我是 C 编程的新手,最近在链表上学习,下面的代码是我制作一个的蹩脚尝试。我想知道是否有人愿意浏览我的代码并解释为什么我面临问题。提前感谢!我会尽力回答任何问题!
为了解释我的一些功能,
创建链接列表- :只需初始化结构链接列表并添加一个 int 值
- 添加链接优先:在末尾添加一个节点
- 删除链接最后:从末尾删除节点 分散链接列表
- :打印链接列表的内容
法典:
#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);
。