如何用C语言创建一个链表,实现增、删、改、查

跪求 要现在网上没有的 写好注释 小弟重谢

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
//函数结果状态码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 4
//Status是函数的类型,其值是函数结果的状态码
typedef int Status;
//定义数据类型
typedef int ElemType;
//----------线性表的动态分配顺序存储结构-------
typedef struct {
ElemType *elem;
int length;
int listsize;
}SqList;
//-----------基本操作--------------------------
Status InitList_sq(SqList *L); //初始化
void DestroyList_sq(SqList *L); //销毁
void ClearList_sq(SqList *L); //置空
Status ListEmpty_sq(SqList *L); //如果表L为空表返回TRUE,否则为FALSE
Status ListLength_sq(SqList *L); //返回L中数据元素个数
void GetElem_sq(SqList *L,int i,ElemType *e); //用e返回i位置的元素
Status PriorElem_sq(SqList *L,int cur_e,ElemType *pre_e); //求前驱
Status NextElem_sq(SqList *L,int cur_e,ElemType *next_e); //求后继
Status ListInsert_sq(SqList *L,int i,ElemType e); //插入
Status ListDelete_sq(SqList *L,int i,ElemType *e); //删除
Status ListTransver_sq(SqList *L); //依次对每个元素调用visit()
Status LocateElem_sq(SqList *L,ElemType e, Status (*compare)(ElemType *,ElemType *));//进行俩个元素的比较
Status MergeList(SqList *La,SqList *Lb,SqList *Lc); //La,Lb归并成Lc
Status ListAppend_sq(SqList *L,ElemType e);

//-----------顺序表基本操作的实现--------------
Status InitList_sq(SqList *L)
{
L->elem = (ElemType *)malloc(LIST_INIT_SIZE* sizeof(ElemType));
if(NULL==L->elem)
return OVERFLOW;
L->length = 0;
L->listsize = LIST_INIT_SIZE;
return OK;
}//InitList_sq

Status ListInsert_sq(SqList *L,int i,ElemType e)
{
if(i<1||i>L->length+1) return ERROR;
if(L->length>=L->listsize){
int *newbase;
newbase = (ElemType *)realloc(L->elem,
(L->listsize + LISTINCREMENT)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW);
L->elem = newbase;
L->listsize += LISTINCREMENT;
}
int *q,*p;
q =&(L->elem[i-1]);
for(p=&(L->elem[L->length-1]);p>=q;--p) *(p+1) = *p;
*q = e;
++L->length;
return OK;
}//ListInsert_sq

Status ListDelete_sq(SqList *L,int i,ElemType *e)
{
if((i<1)||(i>L->length)) return ERROR;
int *p,*q;
p=&(L->elem[i-1]);
*e = *p;
q=L->elem + L->length-1;
for(++p;p<=q;++p) *(p-1)=*p;
--L->length;
return OK;
}//ListDelete_sq

int LocateElem_sq(SqList *L,ElemType e, Status(*compare)(ElemType *,ElemType *))
{
int i=1;
int *p=L->elem;
while(i<=L->length&&(*compare)(p++,&e))
++i;
if(i<=L->length) return i;
else return OK;
}//LocateElem_sq

void MergeList_sq(SqList *La,SqList *Lb,SqList *Lc)
{
InitList_sq(Lc);
ElemType ai,bj;
int i=1,j=1,k=0;
int La_len,Lb_len;
La_len=ListLength_sq(La);
Lb_len=ListLength_sq(Lb);
while((i<=La_len)&&(j<=Lb_len)) {
GetElem_sq(La,i,&ai);
GetElem_sq(Lb,j,&bj);
if(ai<=bj)
{
ListInsert_sq(Lc,++k,ai);
++i;
}
else {
ListInsert_sq(Lc,++k,bj);
++j;
}
}
while(i<=La_len){
GetElem_sq(La,i,&ai);
ListInsert_sq(Lc,++k,ai);
}
while(j<=Lb_len){
GetElem_sq(Lb,j,&bj);
ListInsert_sq(Lc,++k,bj);
}
}//MergeList_sq

int compare(ElemType *e1,ElemType *e2)
{
return (*e1-*e2);
}//compare()

void DestroyList_sq(SqList *L)
{
free(L->elem);
L->elem=NULL;
L->length=0;
L->listsize=0;
}//DestroyList_sq()

void ClearList_sq(SqList *L)
{
memset(L->elem,0,L->listsize *sizeof(ElemType));
L->length=0;
}//ClearList_sq

Status ListEmpty_sq(SqList *L)
{
if(L->length>0) return TRUE;
else return FALSE;
}//ListEmpty_sq

int ListLength_sq(SqList *L)
{
return L->length;
}//ListLength_sq

void GetElem_sq(SqList *L,int i,ElemType *e)
{
if((i>=1)&&(i<=ListLength_sq(L)))
*e=L->elem[i-1];
}//GetElem_sq

Status PriorElem_sq(SqList *L,ElemType cur_e,ElemType *pre_e)
{
int i;
i=LocateElem_sq(L,cur_e,compare);
if(i>1) *pre_e=L->elem[i-2];
else return ERROR;
}//PriorElem_sq

Status NextElem_sq(SqList *L,ElemType cur_e,ElemType *next_e)
{
int i,n;
i=LocateElem_sq(L,cur_e,compare);
n=ListLength_sq(L);
if((i>1)&&i<=n-1) *next_e=L->elem[i];
else return ERROR;
}//NextElem_sq

Status ListTransver_sq(SqList *L)
{
int i,n;
n=ListLength_sq(L);
if(n==0)
{
printf("顺序表已经销毁或清空。\n");
return ERROR;
}
else{
for(i=0;i<n;i++)
printf(" %d",L->elem[i]);
printf("\n");
}
return OK;
}//ListTransver_sq

void PrintElem_sq(ElemType e)
{
printf("%d",e);
}//PrintElem_sq

Status ListAppend_sq(SqList *L,ElemType e)
{
if(L->length>=L->listsize)
{
ElemType *newbase =(ElemType *)realloc(L->elem,(L->length+LISTINCREMENT) *sizeof(ElemType));
if(!newbase)
return ERROR;
L->elem = newbase;
L->listsize +=LISTINCREMENT;
}
L->elem[L->length]=e;
L->length++;
return OK;
}//ListAppend_sq追问

大哥 有没有 没有用到 mallos free 函数 禁用 阶段考核 小弟跪求

追答

他说对了..

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-11-03
你既然知道网上有,那么下载一份,改成你自己的不就好了吗?追问

大哥 有没有 没有用到 mallos free 函数 禁用 阶段考核 小弟跪求

追答

你以为链表是什么,就是c++中的链表也是动态改变大小的,否则那就不是链表,是数组;