C语言链表谁你帮我看看那里错了

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN sizeof(struct Stu)
typedef struct Stu{
char name[20];
int number;
struct Stu *next;
}sqlist;
sqlist *inlist()
{
sqlist *p,*q;
sqlist *head;
int n=0;
printf("请输入名字 学号:\n");
p=q=(sqlist*)malloc(LEN);
scanf("%s%d",&p->name,&p->number);
head=NULL;
while(p->number!=0)
{n=n+1;
if(n==1)
head=p;
else
q->next=p;
q=p;
p=(sqlist*)malloc(LEN);
scanf("%s%d",&p->name,&p->number);
}
q->next=NULL;
return head;
}

void printlist(sqlist *head)
{ sqlist *ps;
ps=head;
if(ps!=NULL)
do
{
printf("姓名:%s 学号:%d\n",ps->name,ps->number);
ps=ps->next;
}while(ps!=NULL);
}
sqlist *deletek(sqlist *head,char *dname)
{
sqlist *pk,*back;
pk=head;
while(1)
{ if(pk=NULL)
return head;
back=pk;
pk=pk->next;
if(!strcmp(pk->name,dname))
{
back->next=pk->next;
free(pk);
break;
}
if(pk!=NULL&&pk->next==NULL)
{
printf("NOT found!\n");
break;
}
}
return head;
}

void main()
{ char dname[20];
sqlist *head;
head=inlist();
printlist(head);
getchar();
printf("请输入你要撤除人的姓名:\n");
gets(dname);
head=deletek(head,dname);
printlist(head);
}
1.输入数据
2.在撤除其中的某个数据,按姓名撤除
3.还有撤除函数要怎么完善,能撤除首尾结点?

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define LEN sizeof(struct Stu)

// 结点定义 

typedef struct Stu{

 char name[20];

 int  number;

 struct Stu *next;

}sqlist;

// 建立链表函数

sqlist *inlist()

{

 sqlist *p=NULL,*q=NULL; // 定义两个指向sqlist类型的指针,并初始化为空。p 指向动态分配的空间,q 指向链表的最后一个结点,即表尾。

 sqlist *head=NULL;  // 定义头结点,并初始化为空

 printf("请输入名字、学号(输入学号小于0为结束):\n");

 p=(sqlist*)malloc(LEN); // 动态分配一个结点空间

 scanf("%s%d",&(p->name),&(p->number) ); // 输入姓名、学号

 while(p->number>0) // 此处以学号大于 0 为有效值。

 {

  if(head==NULL) // 如果是空链表

   head=p;  // 把动态分配的结点地址赋给 head

  else

   q->next=p; // 否则(即链表非空),把 p 的值赋给 表尾处结点的链接成员 next 。

  q=p; // 把新的表尾结点赋给表尾指针 q。

  // 以下三条语句用来输入下一个结点信息

  printf("请输入名字、学号(输入学号小于0为结束):\n");

  p=(sqlist*)malloc(LEN);

  scanf("%s%d",&p->name,&p->number);

 }

  free(p); // 把最后一个无效的输入释放

  q->next=NULL; // 表尾指针的链接成员 next 赋值为 NULL,以结束链表

  return head; // 返回头结点指针

}

// 输出链表函数,参数为指向结点的指针

void printlist(sqlist *head)

{

 if(head==NULL) // 空链表的情况

 {

  printf("The list is empty.\n");

  return ; 

 }

 

 // 链表非空的情况

 sqlist *ps; // 定义指向结点类型的指针,用作循环指针

 ps=head; // 把头结点的值赋给循环指针 ps 

 

 while(ps!=NULL) // 直到 ps 遍历完整个链表,while 循环结束

 {

  printf("姓名:%s    学号:%d\n",ps->name,ps->number); // 输出结点内容

  ps=ps->next; // ps 指向下一个结点

 }

}

// 删除结点函数。注意:第一参数类型为指向头结点的指针。

void deletek(sqlist **head,char* dname)

{

 if(*head==NULL) // 链表为空时

 {

  printf("The list is empty.NO DELETE!\n");

  

  return ;

 }

 // 链表非空时

 sqlist *pk,*back; // 定义两个指向结点类型的指针

 

 back = NULL; // 指针 back 初始化为空

 pk=*head;  // 指针 pk 初始化为链表头结点

 

 if(!strcmp((*head)->name,dname)) // 如果要删除的是头结点

 {

  pk=*head; // 把头结点赋给pk

  *head = (*head)->next; // 头结点指向下一个结点

  printf("%s is deleted.\n",dname); // 打印删除信息

  free(pk); // 释放删除的结点空间

  return ; // 函数结束

 }

 // 如果要删除的不是头结点

 while(pk!=NULL)

 { 

  back=pk; // 把指针pk 的值赋给 指针 back

  pk=pk->next; // pk 指向下一个结点

  if(!strcmp(pk->name,dname)) // 如果是要删除的结点

  {

   back->next=pk->next; // back 的next 指向 pk 的next。即连接要删除结点的前后两个结点

    printf("%s is deleted.\n",dname); // 打印删除信息

   free(pk); // 释放删除的结点空间

   return ; // 函数结束

  } // end if

 }

 

 // 没有找到要删除的结点

 printf("\nThe name cann't be found.\n"); // 打印信息

 return ; // 函数结束

}

// 主函数

void main()

 char dname[20]; // 定义字符串数组,存放要删除结点的姓名

  

 sqlist *head; // 定义指向结点类型的指针,此处用作头结点

 head=inlist(); // 建立链表

 printlist(head);// 打印链表内容

 getchar(); // 接受缓冲区的回车符

 char choice;//定义字符变量choice,选择是否进行删除结点操作

 printf("delete ? yes:y;no:n.\n"); // 提醒用户输入

 //scanf("%c",&choice);

 choice=getchar(); // 输入选择变量 choice,与上句功能相同

 while(choice=='y') // choice值为‘y’时,即执行删除操作

 {

  printf("请输入你要撤除人的姓名:\n");// 提醒输入要删除人的姓名

 // gets(dname);

  scanf("%s",dname); // 输入要删除的人的姓名,与上句功能相同

  deletek(&head,dname); // 调用删除结点函数进行删除操作

  

  printlist(head); // 打印删除结点后的函数

  printf("\n"); // 打印换行符

  getchar(); // 接受缓冲区的回车符

  printf("delete another one ? yes:y;no:n\n"); // 提醒输入以决定是否继续删除

 // scanf("%c",&choice); 

  choice=getchar(); // 输入选择选择变量 choice

 }

 printlist(head); // 最后打印链表内容

 return ; // 主函数结束

}

运行结果:

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-03-25
你这个程序写的还不错,就是局部有些问题。我费了一个多小时,才调试完。具体代码如下(抱歉,我的tc不能显示中文,只能用英文代替了):
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN sizeof(struct Stu)
typedef struct Stu{
char name[20];
int number;
struct Stu *next;
}sqlist;
sqlist *inlist()
{
sqlist *p;
sqlist *head;
printf("name and number:\n");
p=(sqlist*)malloc(LEN);
scanf("%s %d",&p->name,&p->number);
head=p;
while(p->number!=0)
{
p->next=(sqlist*)malloc(LEN);
p=p->next;
printf("name and number:\n");
scanf("%s %d",&p->name,&p->number);
}
p->next=NULL;
return head;
}
void printlist(sqlist *head)
{ sqlist *ps;
ps=head;
if(ps!=NULL)
do
{
printf("name is %s,number is %d\n",ps->name,ps->number);
ps=ps->next;
}while(ps!=NULL);
}
sqlist *deletek(sqlist *head,char *dname)
{
sqlist *pk,*back;
pk=head;
while(1)
{ if(pk==NULL)
return head;
if(!strcmp(head->name,dname))
{
head=head->next;
free(pk);
return head;
}
back=pk;
pk=pk->next;
if(pk==NULL)
{
printf("Not found!\n");
break;
}
if(!strcmp(pk->name,dname))
{
back->next=pk->next;
free(pk);
break;
}
pk=pk->next;
}
return head;
}

void main()
{ char dname[20];
sqlist *head;
head=inlist();
printlist(head);
getchar();
printf("please enter a name you want to del:\n");
gets(dname);
head=deletek(head,dname);
printlist(head);
}
不过仍然可能有bug,你可以多测试下。如有问题还可以问我。希望对你能有帮助。
第2个回答  2011-03-26
我恨链表

C语言实现的合并两个单链表的程序,高手帮忙看下错在哪儿了呢?
3. printf_s函数里面printf("%c",p->ch;p=p->next;);应改为printf("%c",p->ch);p=p->next;4.某些地方s对象的成员x写成了其他字符串。以上是语法错误,还存在编译不报错的逻辑错误,如下 5.s_union合并算法错误。6. s_create采用链表前插法,这样得到的字符序列与输入相反。此外还有一些...

C语言问题,在打印单链表的那个函数那里老是出错
1.main函数中的linklist l;改成 linklist l = (linklist)malloc(sizeof(lnode));2.printflist函数中把l = (linklist)malloc(sizeof(lnode));这一句去掉 原因是main函数中的l变量是个没初始化的野指针,l作为参数传入tailcreatelist函数并不会改变l的值,这点你可以调试的时候跟踪l的值 ...

麻烦大家帮我看看,我用C语言编写的单链表有什么错误,在线急等!!!_百度...
好像没什么大问题,只是粗心问题,代码的执行逻辑没有看但,好像结果正确的,改后的注释在代码上,希望对你有帮助!include <stdio.h>#include <stdlib.h>typedef struct list_node{ char data;struct list_node *next;}linklist;linklist *creatlist_rear() \/\/尾插入法建立单链表{ char ...

C语言单链表创建和排序问题代码问题,我运行时老是程序错误,不知道哪 ...
1、首先说说你的命名问题,不说其他的,在你的工程中,至少要统一化,比如这个函数命名,要么都是小写,要么都是开头大写,这样更让人容易理解。2、关于英文的问题,推荐你一个软件,有道翻译,我都是边写边查找翻译的。3、关于冒泡排序的问题,你可以在看看在百度百科上的例子。我其实不太习惯官方的...

c语言 链表问题
1、p2是结构类型的指针,但当用到p2->next时,p2事先一定指向了链表中的一个结点,否则,p2->next就是错误的,请体会。2、是 p2->next = NULL; 还是p2->next == NULL;,请确认。

C语言关于链表的问题
1,string 是关键词,你应该知道,怎么可以用它来命名结构体呢?2.你的链表很有问题,链表不是这样写的 ,对于链表,要在他的尾指针处加上NULL,这样可以防止内存泄漏,3,程序要分层,比如,你对你的链表,你都没有办法检测这个链构建的对不对,应该在结构体后面至少分成两个函数,一个负责链表的...

大神帮忙看看程序哪里写错了,题目是构建一张26个字母的链表L,以A-Z顺...
程序已经修改调试完成,主要是Printlist的问题:include<stdio.h> include<stdlib.h> include<string.h> typedef struct node{ char data;struct node *next;}Lnode,*Linklist;void Initlist(Linklist L){ L=(Linklist)malloc(sizeof(Lnode));L->next=NULL;} void Createlist(Linklist L){ Li...

我建立这个链表后老出现乱码,是什么原因?请高手帮我看看,谢谢
fread 和 fwrite是二进制方式读写的,所以存到文件中保存成了二进制文件,用记事本之类的文本查看工具看到的肯定是乱码 如果你希望用记事本之类的文本工具查看保存的结果不是乱码,你就应该在程序中使用文本方式读写,使用fprintf 和 fscanf这两个函数 参考资料:http:\/\/zhangliancheng.com\/2011\/04\/text...

【数据结构·C语言】请高手帮忙检查一个关于【链表的归并】算法是否正确...
A.length-1]);p++) *p=*(p+1);其他的都还好。PS,如果想程序运行简单一点,建议你每归并一个B的元素到A就查找一遍A中的元素,但是程序就会麻烦一点,还有,对A的重复元素的自检,可以考虑把if写为while,因为考虑到又可以能连着三个以上的元素相等。希望采纳,期待对你有帮助,欢迎追问^_^ ...

【数据结构·C语言】请高手帮忙检查一个关于【链表归并】的算法是否正...
1. 您的算法不符合题意,题意是不要创建新的结点就是用原来的空间,所以您 C=(ElemType*)malloc(sizeof(LNode));应该是多余的。2. 您的算法因为AB是递增有序要改为递减有序,您就每次将指针移动到序列的最末端来进行比较和插入,由于是单向链表,这样你的算法会非常低效。3. 您仅仅需要将两个...

相似回答
大家正在搜