在C中实现了一个单一的链表。
struct node
{
int data;
struct node *next;
};
struct list_el {
int val;
struct list_el * next;
};
typedef struct list_el item;
void main() {
item * curr, * head,*track;
int i;
head = NULL;
for(i=1;i<=10;i++) {
curr = (item *)malloc(sizeof(item));
curr->val = i;
curr->next=0;
if(head!=NULL)
head->next = curr;
head = curr;
}
curr = curr-10;
while(curr) {
printf("%d\n", curr->val);
curr = curr->next ;
}
}
由于列表中有10个元素,所以为了使指针指向第一个元素,我尝试将curr(指向struct的指针)减少10,但这让我在列表的一半处,打印的值为{ {1}}。
结构的大小是4,而指针的大小是2,似乎指针减少2 * 10 = 20个字节而不是40,这是正常的吗? (因为我读到指针根据其类型的大小递增/递减)
答案 0 :(得分:5)
您不能在链表上使用指针算法:项目是单独分配的(使用malloc),因此它们不一定在内存中相邻。这种方法只适用于数组。
答案 1 :(得分:2)
有几个问题。
首先,以下插入代码不正确:
if(head!=NULL) head->next = curr;
head = curr;
基本上,head
指向的元素不可避免地丢失了。
其次,以下代码的行为未定义:
curr = curr-10;
您无法使用指针算法移动多个malloc()
ed块。
修复插入逻辑后,就可以像这样遍历列表:
for (curr = head; curr != NULL; curr = curr->next) {
....
}
答案 2 :(得分:0)
您的代码curr = curr-10
不会让您回到链接列表的头部。
答案 3 :(得分:0)
正如Viruzzo在评论中指出的那样,你不能在链表的元素上使用指针算法。正如“链接”一词所暗示的那样,只有将项目链接在一起的指针,它们不需要位于相邻的地址。
指针算术只会将指针减少固定的字节数,它不会跟随指针。您的列表是单链接的,甚至不会 以前的元素指针。
答案 4 :(得分:0)
curr = curr-10;
错了。它不会执行您认为的操作!
要打印链接列表的内容,您需要从head
开始并遍历每个节点,直到您点击NULL
(假设它不是循环列表)。
void display()
{
NODE * current = head;
if (current == NULL) {
printf("Empty list \n");
return;
}
while(current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
return;
}
要在前面添加新节点,您可以使用以下代码段。
void addfront(int data)
{
NODE *newnode = NULL;
if ((newnode = malloc(sizeof(NODE))) != NULL) {
newnode->data = data;
newnode->next = NULL;
} else {
printf("Couldn't allocate space for new element \n");
return;
}
if (head == NULL) {
// empty list
head = newnode;
tail = newnode;
} else {
newnode->next = head;
head = newnode;
}
return;
}
要在后面添加新节点,您可以使用以下代码段。
void addrear(int data)
{
NODE * newnode = NULL;
if ((newnode = (NODE *) malloc(sizeof(NODE))) != NULL) {
newnode->data = data;
newnode->next = NULL;
} else {
printf("unalbe to allocate memory to the new element - %d \n", data);
return;
}
if (tail == NULL) {
assert(head == NULL && tail == NULL);
head = tail = newnode;
} else {
tail->next = newnode;
tail = newnode;
}
return;
}
上面提到的所有代码段都假设您有head
和tail
作为全局变量。
希望这有帮助!