跪求C语言链表程序,稍做修改的,鄙视网上直接拷 的!!!邮箱807599078@qq.c...
发布网友
发布时间:2024-10-24 09:35
我来回答
共2个回答
热心网友
时间:2024-11-02 17:01
从自己U盘里复制到。。。不鄙视吧。。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma pack(1)
typedef struct data
{
char addr[50];
char name[30];
long teleno;
struct data *next;
}* L,N;
#pragma pack()
L load(const char *dir)
{
FILE *pfile = fopen(dir,"rb");
if(pfile == NULL)
return NULL;
L head,tail,node;
int flag=1;
//fwrite (const void*, size_t, size_t, FILE*);
node = (L) malloc( sizeof( N ) );
while( fread( node, sizeof(N)-sizeof(L), 1,pfile ) )
{
if(flag)
{
flag=0;
tail=head=node;
}
else
tail= (tail->next=node);
node = (L) malloc( sizeof( N ) );
}
free(node);
tail->next=NULL;
if(fclose(pfile)) return NULL;
return head;
}
int save(const char *dir,L head)
{
FILE *pfile = fopen(dir,"wb");
if(pfile == NULL)
return 0;
while( head )
{
fwrite(head,sizeof(N)-sizeof(L),1,pfile);
head=head->next;
}
if(fclose(pfile)) return 0;
return 1;
}
//查看电话本记录
void look(L head)
{
L p=head;
if(head == NULL)
printf("There is no any record yet.\n ");
else
{
printf("name\t\tnumber\t\taddr\n");
printf("===========================================================\n");
for (;p!=NULL;p = p->next)
{
printf("%s\t\t%ld\t\t%s\n",p->name,p->teleno,p->addr);
}
}
}
//插入新记录
L insert(L head)
{
L p1,p2,p = head;
//读入数据
p1 = (L) malloc(sizeof(N));
printf("please enter information:\n");
printf("name:");
scanf("%s",p1->name);
printf("telepone:");
scanf("%ld",&p1->teleno);
printf("address:");
scanf("%s",p1->addr);
//如果链表为空
if (head == NULL)
{
head = p1;
p1->next = NULL; return head;
}
// 查找插入位置
if( (strcmp(p1->name,p->name)<0) )
{
p1->next = head;
return p1;
}
while((strcmp(p1->name,p->name)>0)&&(p->next!=NULL))
{
p2 = p;
p = p->next;
}
//如果找到位置
if (strcmp(p1->name,p->name)<=0)
{
//如果已经有该姓名
if (strcmp(p1->name,p->name)==0)
{
printf("it exist already.\n");
}
else//新姓名则插入到链表中
{
p2 ->next = p1;
p1 ->next = p;
}
}
else//没有找到位置,则插入到链尾
{
p ->next = p1;
p1->next = NULL;
}
return head;
}
//查找相应记录
void lookup(L head)
{
char name[20];
L p = head;
printf("enter the name to search:\n");
scanf("%s",name);
//循环进行查找
while ((strcmp(p->name,name)!=0)&&(p->next!=0))
{
p = p->next;
}
//如果找到相应记录则显示
if (strcmp(p->name,name)==0)
{
printf("name\t\tnumber\t\taddr\n");
printf("===========================================================\n");
printf("%s\t\t%ld\t\t%s\n",p->name,p->teleno,p->addr);
}
else //如果没有找到则给出提示字串
{
printf("no such record.\n");
}
}
L del(L head)
{
if(!head) return NULL;
char name[100];
scanf("%s",name);
L node=head,pre=node;
while( node->next && strcmp(name,node->name) != 0 )
node = (pre=node)->next;
if( strcmp(node->name,name)==0)
{
if(node != head)
pre->next=node->next;
else
head=node->next;
free(node);
}
return head;
}
int main()
{
int choice;
L head = NULL;
if( (head=load("TelBook.bin")) == NULL) printf("No File Or Load Failed\n");
else printf("Succeed\n");
do
{
printf("enter your choice:\n");
printf("1. 查看\n2. 新增\n3. 查找\n4. 删除\n5. 退出\n");
scanf("%d",&choice);
switch (choice)
{
case 1: look(head);break;
case 2: head = insert(head);save("TelBook.bin",head);break;
case 3: lookup(head);break;
case 4: head = del(head);save("TelBook.bin",head);break;
case 5: exit(0);break;
default:printf("enter choice 1-5:\n");scanf("%d",&choice);
}
} while (true);
}
热心网友
时间:2024-11-02 16:54
/****************************************************************************************
实现链栈各种基本运算的算法 *
编写程序实现链栈种基本运算,并在此基础上设计一个主程序完成如下功能:
1、 初始化栈
2、 判断栈是否为空
3、 依次进栈a,b,c,d,e元素。
4、 判断栈是否为空
5、 输出栈的长度
6、 输出从栈顶到栈底元素
7、 输出出栈序列
8、 判断栈是否为空
9、 释放栈/
*********************************************************************************************/
#include<iostream.h>
#include<stdlib.h>
#include<stdio.h>
#define OVERFLOW -2
#define ok 1
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKCREMENT 10 //增加分量
typedef struct{
char *base;
char *top;
int stacksize;//当前分配的空间
int lenght;
}SqStack; //Sqlist
/*********************************初始化栈*************************************/
int InitStack(SqStack &S)
{
S.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));// 分配存储空间
if(!S.base) exit(0);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
S.lenght=0;
return 1;
}
/******************************************************************************/
/********************************判断栈是否为空******************************/
bool StackEmpty(SqStack&S){
if(S.top==S.base)return 1;
else
return 0;
}
/*****************************释放栈********************************/
int FreeStack(SqStack&S)
{
free(S.base);
S.top=S.base;
return ok;
}
/******************************************************************/
/*********************求出栈的长度*********************************/
int StackLenth(SqStack&S){
S.lenght=S.top-S.base;
return S.lenght;
}
/******************************************************************/
/**********************入栈*****************************************/
int Push(SqStack &S,char e){
if(S.lenght>=S.stacksize){
S.base=(char*)realloc(S.base,(S.stacksize+STACKCREMENT)*sizeof(char));//增加分配存储
if(!S.base) exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKCREMENT;
}
*S.top++=e;
S.lenght++;
return ok;
}
/**************************************************************/
/****************************出栈****************************/
char Pop(SqStack&S,char &e){
if(S.base==S.top)
return 0; //当栈为空时,返回错误
else
e=*--S.top;
S.lenght--;
return e;
}
/*************************显示*******************************/
void DispStack(SqStack S)
{
int i;
for(i=S.lenght;i>0;i--)
{
printf("%c",*(--S.top));
}
printf("\n");
}
//*******************主函数************************************/
int main(){
int i;
SqStack Lst;
char a,b,c,d,e,f;
char g;
printf("初始化栈:\n");
InitStack(Lst);
printf("依次进栈元素a,b,c,d,e,f\n");
cin>>a>>b>>c>>d>>e>>f;
Push(Lst,a);
Push(Lst,b);
Push(Lst,c);
Push(Lst,d);
Push(Lst,e);
Push(Lst,f);
printf("打印\n");
DispStack(Lst);
int l=StackLenth(Lst);
cout<<"栈的长度为"<<l<<endl;
printf("出栈序列:");
for(i=1;i<=6;i++)
{
Pop(Lst,g);
printf("%c ",g);
}
printf("\n");
printf("栈为:%s\n",(StackEmpty(Lst)?"空":"非空"));
printf("释放栈\n");
FreeStack(Lst);
return 0;
}
自己写的,参考课本的,希望对楼主有帮助