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

Python020

如何用纯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)

}

可以用结构体和指针来实现

定义:

定义一个单个元素的结构

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

}

这样便可创建链表