如何实现C语言链表

Python015

如何实现C语言链表,第1张

 链表的创建:

#include “stdlib.h”

#include “stdio.h”

#define NULL 0

#define LEN sizeof(struct student)

struct student

{

long num

float score

struct student *next

}

int n

struct student *creat(void)

{

struct student *head

struct student *p1,*p2

n=0

p1=p2=(struct student *)malloc(LEN)

scanf(“%ld,%f”,&p1->num,&p1->score)

head=NULL

while(p1->num != 0)

{

n=n+1

if(n == 1)

head = p1

else

p2->next = p1

p2 = p1

p1 = (struct student *)malloc(LEN)

scanf(“%ld,%f”,&p1->num,&p1->score)

}

p2->next = NULL

return(head)

}

void main()

{

creat()

}

这样便可创建链表

这个是我们数据结构上机实验的链表问题,

#include<stdio.h>

#include<malloc.h>

#define

LEN

sizeof(LinkNode)

typedef

int

Datatype

typedef

int

Status

typedef

struct

LinkNode{

Datatype

data

struct

LinkNode

*next

}

LinkNode,*LinkList

typedef

struct

OrderedList

{

LinkNode

*head,*tail

int

Listsize

}

OrderedList//有序循环链表的头节点head,尾接接节点

tail及长度Listsize

Status

InitList(OrderedList

*List)//生成循环链表头节点

{

List->tail=List->head=(LinkList)malloc(LEN)

if(List->head==NULL)

return

0

else

{

List->head->next=List->tail

List->tail->next=List->head

List->Listsize=0

return

1

}

}

void

OrderedInsert(OrderedList

*List,Datatype

data)//每调用一次有序插入data形成有序的(从小到大)的链表

{

LinkNode

*p

,*q

if(List->head==List->tail->next)

{

p=(LinkNode*)malloc(LEN)

p->data

=

data

List->head->next=p

p->next=List->tail

List->Listsize++

}

else

{

p=List->head->next

q

=

List->head

while(p->data<data&&p!=List->tail)

{

q

=

p

p=p->next

}

if(p->data==data)

{printf("YOu

have

input

the

same

datas

%d\n\t

YOu

should

input

another

data

\n",data)

scanf("%d",&data)

OrderedInsert(List,data)

}

else

{

p=(LinkNode*)malloc(LEN)

p->data

=

data

p->next

=

q->next

q->next

=

p

List->Listsize++

}

}

}

void

Creatset(OrderedList

*List)//多次调用OrderedInsert()生成有序链表即集合List

{

Datatype

data

int

setsize

,

i=0

printf("Please

input

the

setsize

you

want

to

creat:\n")

scanf("%d",&setsize)

InitList(List)

if(setsize==0)

printf("You

needen't

input

any

data\n")

else

if(setsize==1)

printf("Please

input

a

single

data\n")

else

printf("Please

input

%d

different

datas\n",setsize)

while(i<setsize||setsize>List->Listsize)//当循环次数i小于setsize或者集合内实际元素数List.Listsize小于setsize时一直循环下去

{

scanf("%d",&data)

OrderedInsert(List,data)

i++

}

}

void

Append(OrderedList

*List,Datatype

data)//在循环链表的最后面追加

一个data

{

LinkNode

*p

p=(LinkNode*)malloc(LEN)

p->data=data

List->tail=List->tail->next=p

List->tail->next=List->head

List->Listsize+=1

}

void

MergeList(OrderedList

La,OrderedList

Lb,OrderedList

*Lc)//有序循环链表ListLa,ListLb求并集生成ListLc

{

LinkList

Pa,Pb

Pa=La.head->nextPb=Lb.head->next

while(Pa!=La.tail&&Pb!=Lb.tail)

{

if(Pa->data<=Pb->data)

{

Append(Lc,Pa->data)

Pa=Pa->next

}

else

{

Append(Lc,Pb->data)Pb=Pb->next

}

}

while(Pa!=La.tail)

{

Append(

Lc,Pa->data)Pa=Pa->next}

while(Pb!=Lb.tail)

{

Append(Lc,Pb->data)Pb=Pb->next}

}

void

Print(OrderedList

List)

{

LinkNode

*p

p=List.head->next

if(p->next==List.head)

printf("No

Elem\n")

while(p!=List.head)

{

printf("%5d",p->data)p=p->next

}

printf("\n")

}

void

main()

{

OrderedList

ListLa,ListLb,ListLc

Creatset(&ListLa)

Creatset(&ListLb)

InitList(&ListLc)

MergeList(ListLa,ListLb,&ListLc)

printf("The

orgnial

list

ListLa,ListLb:\n")

Print(ListLa)

Print(ListLb)

printf("The

Merge

list

ListLc\n")

Print(ListLc)

}