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