用C语言编程(创建一个单向链表)

Python014

用C语言编程(创建一个单向链表),第1张

设计程序

创建一个

单向链表

,并输出链表中数据。要求:从键盘

输入数据

元素个数

和值

,并在此基础上实现单

#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

//以上程序直接加到主函数中运行正常