一个纠结的c语言问题(双向链表练习)

mich_mia mich_mia 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<fstream.h>
#include<iostream.h>
struct address
{
char name[9];
char street[40];
char city[9];
char province[9];
char zip[7];
struct address *prior;
struct address *next;
}list_entry;
struct address *start;
struct address *last;
void enter(),display(),search(),save(),load();
main()
{
char s[80],choice;
struct address *info;
start=last=NULL;
for(;;)
{
switch(menue_select())
{
case 1:enter();break;
case 2:delete();break;
case 3:list();break;
case 4:search();break;
case 5:save();break;
case 6:load();break;
case 7:exit(0);
}
}
}

menue_select()
{
char *s[80];
int c;
printf("\t 请选择功能:\n\n");
printf("\t 1.输入通讯处:\n");
printf("\t 2.删除通讯处:\n");
printf("\t 3.列表显示:\n" );
printf("\t 4.查找:\n");
printf("\t 5.将文件存盘:\n");
printf("\t 6.将文件从盘中装入:\n");
printf("\t 7.退出:\n");
do{
printf("\n\t请按数字键选择:");
gets(s);
c=atoi(s);
}while(c<0||c>7);
return(c);
}
void enter()
{
struct address *info,dls_store();
for(;;)
{
info=(struct address *)malloc(sizeof(list_entry));
if(!info)
{
printf("\t内存已用完!\n");
return;
}
inputs("\t 请输入姓名:",info->name,8);
if(!*info->name) break;
inputs("\t 请输入街名:",info->street,39);
inputs("\t 请输入市名:",info->city,8);
inputs("请输入省名:",info->province,8);
inputs("请输入邮编:",info->zip,7);
*start=dls_store(info, start);
}
}
inputs(prompt,s,count)
char *prompt,*s;
int count;
{
char p[255];
do{
printf(prompt);
gets(p);
if(strlen(p)>count)
printf("\t 太长了!");
}while(strlen(p)>count);
strcpy(s,p);
}
struct address *dls_store(i,top)
struct address *i;
struct address *top;
{
struct address *old,*p;
if(last==NULL)
{
i->next=NULL;
i->prior=NULL;
last=i;
return(i);
}
p=top;
old=NULL;
while(p){
if(strcmp(p->name,i->name)<0)
{
old=p;
p=p->next;
}
else
{
if(p->prior)
{
p->prior->next=i;
i->next=p;
i->prior=p->prior;
p->prior=i;
return(top);
}
i->next=p;
i->prior=NULL;
p->prior=i;
return(i);
}
}
old->next=i;
i->next=NULL;
i->prior=old;
last=i;
return(start);
}
delete()
{
struct address *info,*find();
char s[80];

printf("\t:请输入姓名:");
gets(s);
info=find(s);
if(info)
{
if(start==info)
{
start=info->next;
if(start)
start->prior=NULL;
else
last=NULL;
}


else
{
info->prior->next=info->next;
if(info!=last) info->next->prior=info->prior;
else last=info->prior;
}
free(info);
}
}
struct address *find(name)
char *name;
{

struct address *info,*start;
info=start;
while(info)
{
if(!strcmp(name,info->name))
return(info);
info=info->next;
}
printf("\t 未能找到此姓名!\n");
return(NULL);
}
list()
{
register int t;
struct address *info;
info=start;
while(info)
{
display(info);
info=info->next;
}
printf("\n\n");
}
void display(info)
struct address *info;
{
printf("\t%s\n",info->name);
printf("\t%s\n",info->street);
printf("\t%s\n",info->city);
printf("\t%s\n",info->province);
printf("\t%s\n",info->zip);
printf("\n\n");
}
void search()
{
char name[40];
struct address *info,*find();
printf("\t请给要找的姓名:");
gets(name);
if(!(info=find(name)))
printf("\t未找到!");
else
display(info);
}
void save()
{
register int t;
struct address *info;
FILE *fp;
if((fp=fopen("mlist","wb"))==NULL)
{
printf("\t文件不存在!");
exit(0);
}
printf("\t正在存入文件\n");
info=start;
while(info)
{
fwrite(info,sizeof(struct address),1,fp);
info=info->next;
}
fclose(fp);

}
void load()
{
register int;
struct address *info,*temp=NULL;
FILE *fp;
if((fp=fopen("mlist","wb"))==NULL)
{
printf("\t文件打不开!");
exit(1);
}
while(start)
{
info=start->next;
free(info);
start=info;
}
printf("\t正在装入文件!\n");
start=(struct address *)malloc(sizeof(struct address));
if(!start)
{
printf("\t内存已用完!\n");
return;
}
info=start;
while(!feof(fp))
{
if(1!=fread(info,sizeof(struct address),1,fp))
break;
info->next=(struct address *)malloc(sizeof(struct address));
if(!info->next)
{
printf("\t内存已用完!\n");
return;
}
info->prior=temp;
temp=info;
info=info->next;
}
temp->next=NULL;
last=temp;
start->prior=NULL;
fclose(fp);
}

编译之后 出现的是有大概14个warning and 1error
暂时不管warning 只看error
是这样子的
红色部分提示 是
error C2040: 'dls_store' : 'struct address *()' differs in levels of indirection from 'struct address ()'改如何解决
请高手支招

...全文

相关推荐

C语言链表综合练习题

链表练习,可以帮助大家提高C语言链表处练习

xiaosichuan1989

c语言 链表 双向链表 双向循环链表

从linux内核移植出来,独立于用户数据结构,里面有实例参考。C语言代码。

daminglanyu

双向链表C语言实现

通过双向链表实现按照ID序列插入,可以排序实现插入、删除、更新、修改;

wuyu92877

C语言 数据结构双向链表简单实例

双向链表的基本操作     1.利用尾插法建立一个双向链表。     2.遍历双向链表。     3.实现双向链表中删除一个指定元素。     4.在非递减有序双向链表中实现插入元素e仍有序算法。     5.判断双向链表中元素是否对称若对称返回1否则返回0。     6.设元素为正整型,实现算法把所有奇数排列在偶数之前。     7.在主函数中设计一个简单的菜单调试上述算法。 实例代码: //排序的时候因为没有说明奇数和偶数需不需要各自再排序,我就没有排序,只是将奇数放在偶数后面。 //创建链表的时候,因为这个实验没有要求输出链表的长度,所以我就输入了一个长度为n的链表。 #include

weixin_38508549

C语言之双向链表详解及实例代码

1,双向链表简介。 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。 2,例子要求: 完成双向链表的插入、删除以及查找,将学生管理系统使用的数组,以双向链表的方式实现,能够支持无限制的学生人数的增删改查以及保存。 3,代码实现。 #include #include #include #include typedef struct Student{

weixin_38524851
评论 11
收藏 已收藏
分享
返回顶部
mich_mia
C语言 70,039 成员 243,237 内容