#include <stdio.h>
#include<malloc.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 print(struct student *head)
{
struct student *p
printf("\nNow, These %d records are:\n",n)
p=head
if(head!=NULL)
do
{
printf("%ld%5.1f\n",p->num,p->score)
p=p->next
}while(p!=NULL)
}
/******************对链表的删除***********************/
struct student *del(struct student *head,long num)
{
struct student *p1,*p2
if(head==NULL)
{
printf("\nlist null! \n")
return head
}
p1=head
while(num!=p1->num&&p1->next!=NULL)
{
p2=p1
p1=p1->next
}
if(num==p1->num)
{
if(p1==head) head=p1->next
else p2->next=p1->next
printf("delete:%ld\n",num)
n=n-1
}
else printf("%ld not enn found!\n",num)
return(head)
}
/*******************对链表的插入************************/
struct student *insert(struct student *head,struct student *stud)
{
struct student *p0,*p1,*p2
p1=head
p0=stud
if(head==NULL)
{
head=p0
p0->next=NULL
}
else
{
while((p0->num>p1->num)&&(p1->next!=NULL))
{
p2=p1
p1=p1->next
}
if(p0->num<=p1->num)
{
if(head==p1) head=p0
else p2->next=p0
p0->next=p1
}
else
{
p1->next=p0
p0->next=NULL
}
}
n=n+1
return(head)
}
void main()
{
struct student *head,stu
long del_num
printf("input records:\n")
head=creat()
print(head)
printf("\ninput the deleted number:")
scanf("%ld",&del_num)
head=del(head,del_num)
print(head)
printf("\ninput the inserted record:")
scanf("%ld,%f",&stu.num,&stu.score)
head=insert(head,&stu)
print(head)
}
可以用结构体和指针来实现
定义:
定义一个单个元素的结构
typedef struct Chain_tag { // 这里用typedef来定义,方便使用int data // 这里的数据可以是任意类型
//其他数据
struct Chain_tag *prev, *next// 由于Chain为不完全类型,故只能用指针的方式声明
} Chain
使用:
用单个结构体的指针作为head
#include <malloc.h>//Chain的定义写在这里
Chain *
alloc_single_chain(int data /*, (其他参数)*/)
{
Chain *tmp
tmp = malloc(sizeof(Chain))
tmp.data = data
//...其余数据初始化
tmp.prev = tmp.next = NULL // 将前后指针置为NULL
return tmp
}
void
dispose_chain(Chain *target) //其实这里功能简单,用宏实现也可以
{
free(target)
return
}
int main()
{
Chain *head
Chain *pos
head = alloc_single_chain(10)//初始化起始结点
head->next = alloc_single_chain(11)//同理。。下一个结点
for (pos = head pos pos = pos->next)//清理垃圾好习惯
{
dispose_chain(pos)
}
return 0
}
这里有几点要注意:
由于链表用指针来实现,故不要忘记分配内存
垃圾清理时一定要从起始结点开始依次向后释放,以防内存泄漏
链表的创建:
#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()
}
这样便可创建链表