永发信息网

内存不可读的链表。。运行时插入结点,内存不可读

答案:1  悬赏:30  手机版
解决时间 2021-08-20 14:35
  • 提问者网友:战皆罪
  • 2021-08-20 06:52

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
struct node
{
int num;
char str[20];
struct node *next;
};

//创建链表函数
struct node *creat(node *)
{
struct node *head=NULL;
char temp[30];
struct node *p1,*p2;
p1=p2=(struct node*)malloc(sizeof(struct node));
printf ("input num,content:\n");
printf ("exit:double times enter!\n");
gets(temp);
gets(p1->str);
p1->num=atoi(temp);
p1->next=NULL;

while (strlen(p1->str)>0)
{
if (head==NULL)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(struct node*)malloc(sizeof(struct node));
printf ("input num,content: \n");
printf ("exit:double times Enter!\n");
gets(temp);
gets(p1->str);
p1->num=atoi(temp);
p1->next=NULL;
}
return head;
}
//插入节点
struct node *insert(node*,char*,int )
{
struct node *head;
char *pstr;
int n;
struct node *p1,*p2,*p3;
p1=(struct node*)malloc(sizeof(struct node));
strcpy(p1->str,pstr);
p1->num=n;
p2=head;
if(head==NULL)
{
head=p1;
p1->next=NULL;
}
else
{
while (n>p2->num&&p2->next!=NULL)
{
{
p3=p2;
p2=p2->next;
}
if (n<=p2->num)
if (head==p2)
{
head=p1;
p1->next=p2;
}
else
{
p3->next=p1;
p1->next=p2;
}
else
{
p2->next=p1;
p1->next=NULL;
}
}
}
return (head);
}
//删除节点函数
struct node *deltree(node*,char*)
{
struct node *head;
char *pstr;
struct node *temp,*p;
temp=head;
if (head==NULL)
printf ("\nList is null!\n");
else
{
temp=head;
while (strcmp(temp->str,pstr)!=0&&temp->next!=NULL)
{
p=temp;
temp=temp->next;
}
if (strcmp(temp->str,pstr)==0)
{
if (temp==head)
{
head=head->next;
free(temp);
}
else
{
p->next=temp->next;
printf("delete string:%s\n",temp->str);
free(temp);
}
}
else
{printf("\nno find string!\n");}
}
return (head);
}
//链表输出
void print (struct node *head)
{
struct node *temp;
temp=head;
printf ("\n output strings:\n");
while (temp!=NULL)
{
printf ("\n%d----%s\n",temp->num,temp->str);
temp=temp->next;
}
return;
}


//主函数
int main ()
{
struct node *head;
char str[20];
int n;
head=NULL;
head=creat(head);
print(head);
printf ("\n input inserted num,content:\n");
gets (str);
n=atoi(str);
gets(str);
head=insert (head,str,n);
print(head);
printf("\n input deleted content:\n");
gets(str);
head=deltree(head,str);
//printf (head);
return 0;
}
。。。。。。。。。。。谁帮我改下哦~~

最佳答案
  • 五星知识达人网友:舍身薄凉客
  • 2021-08-20 07:48

struct node *insert(node*,char*,int )
{
struct node *head;
char *pstr;
int n;
struct node *p1,*p2,*p3;
p1=(struct node*)malloc(sizeof(struct node));
strcpy(p1->str,pstr);
p1->num=n;
p2=head;
你说插入节点的时候有错误,那就主要改这一段,你这个函数的形参没有名字,这种没有名字的只有在声明的时候才可以用,你在函数实现的时候这么做是严重的错误,传递的参数就一定作用没有了.


typedef struct
{
int num;
char str[20];
struct node *next;
}node; //define the struct


node *insert(node * head,char*pstr,int n)
{
node *p1,*p2=head; //define the new struct
while(p2->next)
p2=p2->next; //扫描链表到尾部
p1=(node*)malloc(sizeof(node));//分配内存
strcpy(p1->str,pstr);//进行赋值
p1->num=n;
p2->next=p1;//插到链表尾部
p1->next=NULL;
}


我只写出了一部分,供你参考,你问的主要问题都在这里.我没有在插入的时候进行排序.

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯