#includestdio.h
我们提供的服务有:成都网站设计、成都网站建设、微信公众号开发、网站优化、网站认证、源汇ssl等。为近千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的源汇网站制作公司
#includestdlib.h
//链表定义
typedef int ElemType;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
/*************************************
* 链表函数 *
*************************************/
//链表初始化
void InitLink(LinkList L);
//创建函数,尾插法
void CreateLink_T(LinkList L,int n);
//创建函数,头插法
void CreateLink_H(LinkList L,int n);
//销毁函数
void DestroyLink(LinkList L);
//判断是否为空函数
bool EmptyLink(LinkList L);
//获取函数
bool GetLink(LinkList L,int i,int e);
//插入函数
void InsertLink(LinkList L,int i,int e);
//删除函数
void DeleteLink(LinkList L,int i,int e);
//遍历函数
void TraverseLink(LinkList L);
//链表长度函数
int LengthLink(LinkList L);
//合并函数
void MergeLink(LinkList L1,LinkList L2);
void main()
{
LinkList L1,L2;
InitLink(L1);
InitLink(L2);
CreateLink_H(L1,2);
CreateLink_T(L2,2);
TraverseLink(L1);
printf("\n");
TraverseLink(L2);
printf("\n");
MergeLink(L1,L2);
TraverseLink(L1);
TraverseLink(L2);
}
//创建函数,尾插法
void InitLink(LinkList L)
{
L=(LinkList)malloc(sizeof(LNode));
if (!L)
{
printf("Init error\n");
return;
}
L-next=NULL;
}
void CreateLink_T(LinkList L,int n)
{
if(n1)
{
printf("n must =1\n");
return ;
}
else
{
// L=(LinkList)malloc(sizeof(LNode));
L-next=NULL;
for(int i=0;in;i++)
{
LinkList p=(LinkList)malloc(sizeof(LNode));// the lower letter p
printf("enter the data :\t");
scanf("%d",(p-data));
p-next=L-next;
L-next=p;
}
}
}
//创建函数,头插法
void CreateLink_H(LinkList L,int n)
{
if (n1)
{
printf("n must =1\n ");
return;
}
else
{
//L=(LinkList)malloc(sizeof(LNode));
LinkList pre=(LinkList)malloc(sizeof(LNode));
L-next=NULL;
pre=L;
for(int i=0;in;i++)
{
LinkList p=(LinkList)malloc(sizeof(LNode));
printf("enter the data:\t");
scanf("%d",(p-data));
pre-next=p;
pre=p;
}
pre-next=NULL;
}
}
//销毁函数
void DestroyLink(LinkList L)
{
LinkList q=L,p=L;
while (p)
{
q=p;
p=p-next;
free(q);
}
L-next=NULL;
}
//判断是否为空函数
bool EmptyLink(LinkList L)
{
if (NULL==L-next)
{
return true;
}
else
{
return false;
}
}
//获取函数
bool GetLink(LinkList L,int i,int e)
{
if (i1)
{
return false;
}
else
{
if (EmptyLink(L))
{
return false;
}
LinkList p=L-next;
int j=1;
while(pji)
{
p=p-next;
j++;
}
if (!p||ji)
{
return false;
}
else
{
e=p-data;
return true;
}
}
}
//插入函数
void InsertLink(LinkList L,int i,int e)
{
if (i0||iLengthLink(L))
{
printf("Insert error\n");
return;
}
else
{
LinkList p=L;
int j=0;
while(p(ji))
{
p=p-next;
j++;
}
if (!p||ji)
{
printf("Insert error\n");
return;
}
else
{
LinkList q=(LinkList)malloc(sizeof(LNode));
q-data=e;
q-next=p-next;
p-next=q;
}
}
}
//删除函数
void DeleteLink(LinkList L,int i,int e)
{
if(i=0||iLengthLink(L))
{
printf("delete error\n");
return;
}
else
{
LinkList p=L;
int j=0;
while(pji-1)
{
p=p-next;
j++;
}
if(!p||ji)
{
printf("please enter i again\n");
return;
}
else
{
LinkList q=p-next;
e=p-next-data;
p-next=p-next-next;
free(q);
}
}
}
//遍历函数
void TraverseLink(LinkList L)
{
LinkList p=L-next;
if(!p)
{
printf("the Link L is empty\n");
}
while(p)
{
printf("%d\n",p-data);
p=p-next;
}
}
//链表长度函数
int LengthLink(LinkList L)
{
int i=0;
LinkList p=L-next;
while(p)
{
p=p-next;
i++;
}
return i;
}
//合并函数
void MergeLink(LinkList L1,LinkList L2)
{
int i=0,flag=0;
LinkList p1=L1-next,p2=L2-next;
LinkList p=(LinkList)malloc ((LengthLink(L1)+LengthLink(L2)+2)*sizeof(LNode));
LinkList pre=p;
if (!p)
{
printf("MergeLink error\n");
return;
}
p-next=NULL;
while (p1p2)
{
if (p1-data=p2-data)
{
InsertLink(p,i++,p2-data);
p2=p2-next;
}
else
{
InsertLink(p,i++,p1-data);
p1=p1-next;
}
}
while (p1)
{
InsertLink(p,i++,p1-data);
p1=p1-next;
}
while(p2)
{
InsertLink(p,i++,p2-data);
p2=p2-next;
}
while(pre)
{
pre=pre-next;
}
LinkList q=L1;
L1=p;
DestroyLink(q);
DestroyLink(L2);
}
#includestdio.h
#includestdlib.h
typedef struct data { int number; struct data *next; } DATA;
int main() { int n; DATA *head,*p;
printf("how many?\n"); scanf("%d",n); head=create(n); printf("there is all\n");
while ( head!=NULL ) { printf("%d ",head-number); head=head-next; } printf("\n");
while ( head!=NULL ) { p=head; head=head-next; free(p); }
return 0;
}
DATA *create(int n) { DATA *head=NULL,*t=NULL,*tial=NULL; int i;
printf("let's create it\n"); head=(DATA*)malloc(sizeof(DATA));
if ( !head ) { printf("error"); return NULL; }
head-next=NULL; printf("enter your data\n"); scanf("%d",head-number);
for ( i=1,tial=head;in;i++ ) {
t=(DATA*)malloc(sizeof(DATA)); if ( !t ) { printf("error"); return head; }
scanf("%d",t-number); t-next=NULL; tial-next=t; tial=t;
}
return head;
}
可以用结构体和指针来实现
定义:
定义一个单个元素的结构
typedef struct Chain_tag { // 这里用typedef来定义,方便使用
int data; // 这里的数据可以是任意类型
//其他数据
struct Chain_tag *prev, *next;// 由于Chain为不完全类型,故只能用指针的方式声明
} Chain;
使用:
用单个结构体的指针作为head
#include malloc.h
//Chain的定义写在这里
Chain *
alloc_single_chain(int data /*, (其他参数)*/)
{
Chain *tmp;
tmp = malloc(sizeof(Chain));
tmp.data = data;
//...其余数据初始化
tmp.prev = tmp.next = NULL; // 将前后指针置为NULL
return tmp;
}
void
dispose_chain(Chain *target) //其实这里功能简单,用宏实现也可以
{
free(target);
return;
}
int main()
{
Chain *head;
Chain *pos;
head = alloc_single_chain(10);//初始化起始结点
head-next = alloc_single_chain(11);//同理。。下一个结点
for (pos = head; pos; pos = pos-next)//清理垃圾好习惯
{
dispose_chain(pos);
}
return 0;
}
这里有几点要注意:
由于链表用指针来实现,故不要忘记分配内存
垃圾清理时一定要从起始结点开始依次向后释放,以防内存泄漏
主函数这里
Linklist List;
printf("输入创建链表的长度:");
scanf("%d",num);
CreateList_H(List,num); //创建链表
改为
LNode List;
printf("输入创建链表的长度:");
scanf("%d",num);
CreateList_H(List,num); //创建链表
函数内在堆上分配好内存,但是 没有传递到栈上
另外 你的变量名很迷人
#includestdio.h
#includestring.h
#includeconio.h
#includestdlib.h
typedef struct
{
char sno[10];
char name[10];
float score[3];
}Student;
typedef struct node
{
Student data;
struct node *next;
}LinkList;
Student s;
LinkList *head=NULL;
LinkList *last=NULL;
void Create(Student s)
{
LinkList *p;
p=(LinkList*)malloc(sizeof(LinkList));
p-data=s;
p-next=NULL;
if(head!=NULL)
{
last-next=p;
last=p;
}
else
{
head=p;
last=p;
}
}
void OutPut()
{
LinkList *p;
p=head;
while(p!=NULL)
{
printf("\n%5s%5s%5.1f%5.1f%5.1f",p-data.sno,p-data.name,p-data.score[0],p-data.score[1],p-data.score[2]);
p=p-next;
}
}
void Delete(LinkList *p) //*p 是要删除的节点
{
LinkList *q;
q=head;
while(q!=NULL q-next!=p)
q=q-next;
if(q==NULL)printf("\nNode not exist!");
else
{
printf("删除的节点是:");
printf("\n%5s%5s%5.1f%5.1f%5.1f",p-data.sno,p-data.name,p-data.score[0],p-data.score[1],p-data.score[2]);
q-next=p-next;
free(p);
}
}
void Append(Student s)
{
LinkList *p;
LinkList *q;
p=last; //尾插法
q=(LinkList*)malloc(sizeof(LinkList));
q-data=s;
q-next=p-next;
p-next=q;
}
void Save()
{
FILE *fp;
LinkList *p;
p=head;
// char filename="student.txt"
if(fp=fopen("filename","wb")==NULL)printf("\nfile open error");
while(p)
{
if(fwrite((p-data),sizeof(Student),1,fp)!=1)
printf("\nfile write error");
p=p-next;
}
fclose(fp);
}
LinkList * Query(Student s)
{
LinkList *q;
q=head;
while(q!=NULL)
{
if(strcmp(q-data.sno,s.sno)!=0)
q=q-next;
else break;
}
return q;
}
int main()
{
LinkList *p;
int ch;
do
{
system("cls");
printf("\n1.创建 2.添加 3.删除 4.查询 5.保存文件 6.输出 0.退出\n");
scanf("%d",ch);
switch(ch)
{
case 1:printf("\n请输入:学号,姓名,三门分数\n");
scanf("%s%s%f%f%f",s.sno,s.name,s.score[0],s.score[1],s.score[2]);
Create(s);break;
case 2:printf("\n请输入:学号,姓名,三门分数\n");
scanf("%s%s%f%f%f",s.sno,s.name,s.score[0],s.score[1],s.score[2]);
Append(s);break;
case 3:printf("\n请输入要删除的学号:"); //按学号删除;
scanf("%s",s.sno);
p=Query(s);
Delete(p);break;
case 4:printf("\n请输入要查询的学号:"); //按学号查询
scanf("%s",s.sno);
p=Query(s);
printf("\n%5s%5s%5.1f%5.1f%5.1f",p-data.sno,p-data.name,p-data.score[0],p-data.score[1],p-data.score[2]);
break;
case 5:Save();break;
case 6:OutPut();break;
case 0:exit(0);
}
printf("\npress any key return to menu...");
getch();
}while(1);
return 0;
}
.....