#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 ; // 主函数结束
}
运行结果:
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. 您仅仅需要将两个...