代码如下:
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函数就会报错。不使用就会造成内存泄露。
在void InsertLinkList(LinkList head,DataType x,int i) 中的这句代码写错了:
p=(Node*)malloc(sizeof(Node*));
应该为:
p=(Node*)malloc(sizeof(Node));