代码如下:
Liner.h
#include<stdio.h>
#define Maxsize 7
typedef int DataType;
//顺序表定义
typedef struct {
DataType data[Maxsize];
int length;
}SeqList;
void InsertSeqlist(SeqList* L,DataType x,int i);
void DeleteSeqlist(SeqList* L,int i);
int LocateSeqlist(SeqList* L,DataType x);
void PrintfSeqList(const SeqList L);
//单链表定义
typedef struct node{
DataType data; //数据域
struct node* next;//指针域
} Node,*LinkList;
LinkList InitateLinkList();
int LengthLinkList(LinkList head);
Node * GetLinkList(LinkList head,int i);
int LocateLinkList(LinkList head,DataType x);
void InsertLinkList(LinkList head,DataType x,int i);
void DeleteLinkList(LinkList head,int i);
void PrintfLinkList(const LinkList head);
Liner.c
#include<stdio.h>
#include<stdlib.h>
#include"Liner.h"
void InsertSeqlist(SeqList* L,DataType x,int i)
{
int j=0;
//将元素x插入到顺序表L的第i个数据元素之前
if(L->length==Maxsize)
{
exit(1);
}
//检测位置
if(i<1 || i>L->length+1) exit(1);
for(j=L->length;j>=i;j--)
L->data[j]=L->data[j-1];
L->data[j]=x;
L->length++;
}
void DeleteSeqlist(SeqList* L,int i)
{
int j=0;
if(i<1 || i>L->length)
{
printf("删除位置错误!");
exit(1);
}
//删除操作
for(j=i-1;j<L->length-1;j++)
{
L->data[j]=L->data[j+1];
}
L->length--;
}
int LocateSeqlist(SeqList* L,DataType x)
{
int i=0;
while((i<L->length) && L->data[i]!=x)
i++;
if(i<L->length) return i+1;
else return 0;
}
void PrintfSeqList(const SeqList L)
{
int i=0;
for(i=0;i<L.length;i++)
if(i!=L.length-1)
printf("%d,",L.data[i]);
else printf("%d\r\n",L.data[i]);
if(L.length==0) printf("无\r\n");
}
//单链表操作算法
LinkList InitateLinkList()
{
//建立一个空的单链表
LinkList head;
head=(LinkList)malloc(sizeof(Node));//强制转换
head->next=NULL;
return head;
}
int LengthLinkList(LinkList head)
{
//求单链表的长度
Node *p=head;
int cnt=0;
while(p->next!=NULL)
{
p=p->next;
cnt++;
}
return cnt;
}
Node * GetLinkList(LinkList head,int i)
{
int c=1;
//获取指定为位置的节点
Node *p;
p=head->next;//head节点不存储数据
while(c<i && p!=NULL)
{
p=p->next;c++;
}
if(i==c) return p;
else return NULL;
}
int LocateLinkList(LinkList head,DataType x)
{
//根据数据元素查找位置
int i=1;
Node *p=head->next;
while(p!=NULL && p->data!=x)
{
p=p->next;i++;
}
if(p->data==x) return i;
else return 0;
}
void InsertLinkList(LinkList head,DataType x,int i)
{
Node *pre,*p;//pre是目标节点的前一个节点
if(i==1) pre=head;
else pre=GetLinkList(head,i-1);
if(pre==NULL)
{
printf("找不到插入的位置!");
return;
}
p=(Node*)malloc(sizeof(Node*));
p->data=x;
p->next=pre->next;
pre->next=p;
}
void DeleteLinkList(LinkList head,int i)
{
Node *q,*p;//q是直接前驱,p是待释放的节点
if(i==1) q=head;
else q=GetLinkList(head,i-1);
if(q!=NULL && q->next!=NULL)
{
p=q->next; //指向待释放的节点
q->next=p->next; //赋值给直接前驱的下一个节点
free(p);
}
else exit(1);
}
void PrintfLinkList(const LinkList head)
{
Node *p=(head->next);
if(head==NULL) return;
while(p!=NULL)
{
if((p->next)!=NULL)
{
printf("%d,",p->data);
}
else
{
printf("%d\r\n",p->data);
}
p=p->next;
}
}
Test.c
复制代码
#include<stdio.h>
#include"Liner.h"
int main(void)
{
/*
int i=0;
SeqList student={{0},0};//声明并初始化
InsertSeqlist(&student,1,1);
InsertSeqlist(&student,2,2);
InsertSeqlist(&student,3,3);
InsertSeqlist(&student,4,4);
InsertSeqlist(&student,5,5);
InsertSeqlist(&student,6,6);
printf("显示信息表元素:");
PrintfSeqList(student);
printf("线性表长度:%d\r\n\r\n",student.length);
for(i=student.length;i>0;i--)
{
printf("执行删除操作...\r\n删除第%d个\r\n",i);
DeleteSeqlist(&student,i);
PrintfSeqList(student);
printf("\r\n");
}
*/
int i=3;
LinkList head=InitateLinkList();
InsertLinkList(head,1,1);
InsertLinkList(head,2,1);
for(i=3;i<100;i++)
InsertLinkList(head,i,i);
PrintfLinkList(head);
for(--i;i>3;i--)
DeleteLinkList(head,i);
printf("删除后:\r\n");
PrintfLinkList(head);
getchar();
return 0;
}
问题:现在只要使用free函数就会报错。不使用就会造成内存泄露。