linklist.h
#ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED
typedef int ElementType;
struct linklist;
typedef struct linklist *LinkList;
typedef LinkList Position;
/**< 函数如无返回值,且须改变参数值时,课使用二级指针 */
/**< 有返回值使用以及指针即可,传值调用即体现在此,指针亦不例外 */
LinkList CreatLinkList(LinkList L,int N); /**< 创建链表,长度为N,函数如无返回值参数需用二级指针 */
void PrintLinkList(LinkList L); /**< 打印链表 */
LinkList DeleteLinkList(LinkList L); /**< 销毁整表 */
int IsEmpty(LinkList L); /**< 表是否为空 */
int IsLast(Position P, LinkList L); /**< 位置P是否为最后 */
Position Find(ElementType X, LinkList L); /**< 查找元素X的位置 */
Position FindPrevious(ElementType X, LinkList L); /**< 查找元素X之前的位置 */
LinkList Delete(ElementType X, LinkList L); /**< 删除元素X */
LinkList Insert(ElementType X, LinkList L); /**< 插入元素X */
#endif // LINKLIST_H_INCLUDED
linklist.c
#include <stdio.h>
#include <malloc.h>
#include <time.h>
#include <math.h>
#include <io.h>
#include "linklist.h"
struct linklist
{
ElementType data;
LinkList next;
};
/**< 创建链表 */
LinkList CreatLinkList(LinkList L,int n)
{
LinkList P;
int i;
L=(LinkList)malloc(sizeof(struct linklist));
if(L==NULL)
printf("out of space!!!");
L->next =NULL;
for(i=0;i < n;i++)
{
P=(LinkList)malloc(sizeof(struct linklist));
P->data=rand()%100+1;
P->next =L->next;
L->next =P;
}
return L;
}
/**< 打印链表 */
void PrintLinkList(LinkList L)
{
Position P;
P=L->next;
while(P!=NULL)
{
printf("%d\t",P->data);
P=P->next;
}
}
/**< 销毁整表 */
LinkList DeleteLinkList(LinkList L)
{
LinkList temp,P;
P=L->next;
while(P)
{
temp=P->next; /**< temp=P;free(P);P=temp->next; this is wrong, temp must point to the next node*/
free(P);
P=temp;
}
L->next =NULL;
return L;
}
/**< 表是否为空 */
int IsEmpty(LinkList L)
{
return L->next==NULL;
}
/**< 位置P是否为最后 */
int IsLast(Position P, LinkList L)
{
return P->next ==NULL;
}
/**< 查找元素X的位置 */
Position Find(ElementType X, LinkList L)
{
LinkList P;
P=L->next;
while(P != NULL && P->data !=X)
{
P=P->next;
}
return P;
}
/**< 查找元素X之前的位置 */
Position FindPrevious(ElementType X, LinkList L)
{
LinkList P;
P=L; /**< P=L->next;如此写不能正确删除首位数据 */
while(P ->next!= NULL && P->next->data !=X)
{
P=P->next;
}
return P;
}
/**< 删除元素X */
LinkList Delete(ElementType X, LinkList L)
{
Position P,temp;
P=FindPrevious(X,L);
temp=P->next;
P->next =temp->next;
free(temp);
return L;
}
/**< 插入元素X */
LinkList Insert(ElementType X, LinkList L)
{
Position P,temp;
temp=(LinkList)malloc(sizeof(struct linklist));
P=L->next;
temp->data =X;
temp->next=P;
L->next =temp;
return L;
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include "linklist.c"
int main()
{
LinkList L;
L=(LinkList)malloc(sizeof(struct linklist));
L=CreatLinkList(L,12);
PrintLinkList(L);
putchar(10); /**< printf('\n');这一句为何会警告? */
printf("\n"); /**< 该函数参数为指针,需用双引号 */
L=Delete(46,L);
PrintLinkList(L);
putchar(10);
L=Insert(17,L);
PrintLinkList(L);
DeleteLinkList( L);
getchar();
return 0;
}
个别地方还不是太完整。