创建一个
单向链表
,并输出链表中数据。要求:从键盘
输入数据
元素个数
和值
,并在此基础上实现单
#include<stdio.h>#include<stdlib.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(n<1)
{
printf("n must >=1\n")
return
}
else
{
// L=(LinkList)malloc(sizeof(LNode))
L->next=NULL
for(int i=0i<ni++)
{
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 (n<1)
{
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=0i<ni++)
{
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 (i<1)
{
return false
}
else
{
if (EmptyLink(L))
{
return false
}
LinkList p=L->next
int j=1
while(p&&j<i)
{
p=p->next
j++
}
if (!p||j>i)
{
return false
}
else
{
e=p->data
return true
}
}
}
//插入函数
void InsertLink(LinkList &L,int i,int e)
{
if (i<0||i>LengthLink(L))
{
printf("Insert error\n")
return
}
else
{
LinkList p=L
int j=0
while(p&&(j<i))
{
p=p->next
j++
}
if (!p||j>i)
{
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||i>LengthLink(L))
{
printf("delete error\n")
return
}
else
{
LinkList p=L
int j=0
while(p&&j<i-1)
{
p=p->next
j++
}
if(!p||j>i)
{
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 (p1&&p2)
{
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)
}
struct infor{
char name[10]//学生名称
int age//年龄
struct infor *next//存储下一个结构的地址
}//链表的数据结构
struct infor *head=NULL//头指针,指向第一个结构
struct infor *p,*c//*p:是当前结构的前一个结构地址;*c:当前指针
char buf[10]//存放name的临时数组
printf("Enter name:")//提示
while(scanf("%s",buf)==1 &&buf[0]!='0')//name输入0时结束
{
c=(struct infor *)malloc(sizeof(struct infor))//给结构分配内存
if(c==NULL)/无法分配内存
{
printf("No memory")
exit(1)
}
if(head==NULL)
{
head=c//第一个结构地址
}
else
{
p->next=c//下一个结构的地址
}
c->next=NULL//表示最后一个结构
strcpy(c->name,buf)//拷贝name到链表中
printf("Enter age:")
scanf("%d",&c->age)//输入年龄
p=c//指向前一个节点
printf("Enter name:")
}
c=head
while(c!=NULL)
{
printf("name=%s age=%d\n",c->name,c->age)
c=c->next
}//读取链表中的信息
printf("over\n")
c=head
while(c!=NULL)
{
free(c)
c=c->next
}//释放内存
运行结果:
Enter name:Jim
Enter age:25
Enter name:Tom
Enter age:36
Enter name:Jack
Enter age:65
Enter name:0
name=Jim age=25
name=Tom age=36
name=Jack age=65
over
//以上程序直接加到主函数中运行正常