#include <stdio.h>
#include <stdlib.h>
struct cir{
int info;
struct cir* next;
};
struct cir* create(int num){
struct cir* temp;
temp=(struct cir*)malloc(sizeof(struct cir));
temp->info=num;
temp->next=NULL;
return(temp);
}
struct cir* insertlast(struct cir** head0, struct cir* new1){
struct cir* temp;
temp=(*head0);
if(temp==NULL){
new1->next=new1;
return(new1);
}
else{
while(temp->next !=(* head0) ){
temp=temp->next;
temp->next=new1;
new1->next=(*head0) ; }
}
return(*head0);
}
void vizualize(struct cir* head0){
struct cir* temp;
temp=head0;
printf("Lista:");
while(head0->next != temp ){
printf("[%d]-->", head0->info);
head0 =head0 ->next;
}
printf("%d(testa)", head0->info);
}
int main(){
struct cir* head;
int i,n1,n2;
struct cir* new1;
printf("Insert the number of elements you want to put in the list:nn");
scanf("%d", &n1);
for(i=0;i<n1;i++){
printf("Insert the element you want to insert in the list:nn");
scanf("%d", &n2);
new1=create(n2);
insertlast(&head,new1);
}
vizualize(head);
}
嗨!我已经编写了此代码以实现圆形列表,但是当我尝试运行它崩溃的代码时。
我已经创建了函数struct cir* create(int num)
来创建一个单个元素,以通过调用函数struct cir* insertlast(struct cir** head0, struct cir* new1
来攻击循环列表中的函数列表中的单个元素。
此外,作为双向列表的重述:
if(temp->next!=NULL){
(temp->next)->prev=NULL;
什么是
(temp->next)->prev=NULL;
做?
最后一个问题,是否有人可以在这里编写一个代码来删除单向列表中间的元素?我已经尝试过任何方式,但是每次尝试删除一个元素,程序m崩溃或列表以相同的方式进行了vizalize!
非常感谢!
ps.从列表中删除和提取元素之间的区别?
这将有效:
#include <stdio.h>
#include <stdlib.h>
struct cir {
int info;
struct cir* next;
};
struct cir* create(int num) {
struct cir* temp;
temp = (struct cir*)malloc(sizeof(struct cir));
temp->info = num;
temp->next = NULL;
return(temp);
}
struct cir* insertlast(struct cir* head0, struct cir* new1) {
struct cir* last;
if ( head0 == NULL ) {
new1->next = new1;
return new1;
}
else {
last = head0;
while (last->next != head0) {
last = last->next;
}
last->next = new1;
new1->next = head0;
return head0;
}
}
void vizualize(struct cir* head0) {
struct cir* temp;
if (head0) {
temp = head0;
printf("List:");
do {
printf("[%d]-->", temp->info);
temp = temp->next;
} while ( temp != head0 );
}
}
int main() {
struct cir* head;
int i, n1, n2;
struct cir* new1;
head = 0;
printf("Insert the number of elements you want to put in the list:nn");
scanf("%d", &n1);
for (i = 0; i < n1; i++) {
printf("Insert the element you want to insert in the list:nn");
scanf("%d", &n2);
new1 = create(n2);
head = insertlast(head, new1);
}
vizualize(head);
}
只是注意,我已经在C 编译器上进行了测试,而不是C。
这是删除和提取元素之间的区别 从列表中?
提取物表示您从列表中删除元素并可以使用它。删除意味着您不仅要从列表中删除,还要从列表中删除。
问题是插入函数。第一个问题是何时插入并且列表为空(您还忘记了在主机中初始化null的头部),因为您只是为新元素设置了"下一个"指针,而不会使其成为新元素列表。
然后,当滚动浏览列表时,您写的方式是在循环时,循环直到找到插入点,然后退出而无需实际做任何事情。
这里是该函数的校正工作版本:
struct cir* insertlast(struct cir** head0, struct cir* new1) {
struct cir* temp;
temp = (*head0);
if(temp == NULL) {
new1->next = new1;
*head0 = new1;
return(*head0);
}
else {
while(temp->next != (*head0)) {
temp = temp->next;
}
temp->next = new1;
new1->next = (*head0);
}
return(*head0);
}
关于
的含义(temp->next)->prev=NULL;
在双向列表中,它将"临时"指向的节点设置为null,因为从" temp"中,您转到下一个元素,然后再次转到上一个元素,这与开始相同(给出了那个开始(给定)正确设置了下一个"one_answers" prev")。
最后,要从单向列表中删除元素,您必须在要删除和重新排列指针之前就停止元素:
while(temp->next->info != target){
temp=temp->next
}
struct circ* node_to_delete = temp->next;
temp->next = node_to_delete->next;
free(node_to_delete);
我认为提取和删除之间没有明确的差异,但是通常我会考虑提取时只能从列表中删除元素时提取。