c语言数据结构单链表建立

Python014

c语言数据结构单链表建立,第1张

do

{

printf("%d ",p->data)

p=p->next

}while((p->next)!=NULL)

上面改为:

do

{

printf("%d ",p->data)

p=p->next

}while(p!=NULL)

*creat a list*/

#include "stdlib.h"

#include "stdio.h"

struct list

{ int data

struct list *next

}

typedef struct list node

typedef node *link

void main()

{ link ptr,head

int num,i

ptr=(link)malloc(sizeof(node))

ptr=head

printf("please input 5 numbers==>\n")

for(i=0i<=4i++)

{

scanf("%d",&num)

ptr->data=num

ptr->next=(link)malloc(sizeof(node))

if(i==4) ptr->next=NULL

else ptr=ptr->next

}

ptr=head

while(ptr!=NULL)

{ printf("The value is ==>%d\n",ptr->data)

ptr=ptr->next

}

}

上面是一个简单的创建链表的C程序。所谓链表形象的讲就是一个数据块里面存有数据,并且存有下一个数据的指针,这样一个指一个形成一个数据链。这个数据链可以被操作,例如插入数据,删除数据,等。至于指令,首先定义一个结构体,它存有数据和指向下一个数据块的指针。然后分配空间。注意最后一个为NULL,当然你也可以指向开头一个数据块形成一个循环链表

#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)

}