如何用纯C语言编写一个通用链表?

Python012

如何用纯C语言编写一个通用链表?,第1张

以前写的一个,可参考一下。

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

}

#include<stdio.h>

#include<stdlib.h>

struct chain

{

int value

struct chain *next

}

struct chain *create()

{

struct chain *head,*tail,*p

int x

head = tail = NULL

while(scanf("%d",&x)==1)

{

p=(struct chain*)malloc(sizeof(struct chain))

p->value=x

p->next=NULL

if(head==NULL)

head = tail = p

else

tail=tail->next=p

}

return head

}

struct chain *inlink(struct chain *head,int a,int b)//int a代表要插入的节点,int b代表创建节点的数据域

{

struct chain *p,*q,*s

s = (struct chain *)malloc(sizeof(struct chain))

s->value=b

if(head==NULL)

{

head = s

head->next = NULL

}

if(head->value == a)

{

s->next=head

head = s

}

else

{

p=head

while((p->value!=a)&&(p->next!=NULL))

{

q=p

p=p->next

}

if(p->value == a)

{

q->next = s

s->next = p

}

else

{

p->next=s

s->next=NULL

}

}

return (head)

}

struct chain *dellink(struct chain *head,int a) //int a代表要删除的节点

{

struct chain *q,*p

if(head == NULL)

printf("找不到节点!\n")

else if(head->value == a)

{

p = head

head = head->next

}

else

{

p=head

while((p->value!=a)&&(p->next!=NULL))

{

q=p

p=p->next

}

if(p->value != a)

printf("链表不存在此节点!\n")

else

{

q->next = p->next

free(p)

}

}

return (head)

}

void main()

{

struct chain *p,*q

q=create() //链表的创建;

//q=inlink(create(),3,1) //链表的插入;

//q=dellink(create(),2) //链表的删除;

while(q){ //输出链表;

printf("%d\n",q->value)

p=q->next

free(q)

q=p

}

}

这样可以么?