#define INIT_LIST_SIZE 2
#define NODE_ADD_SIZE 1
#define ElemType int
#define TRUE 1
#define FALSE 0
typedef struct sq_list{
ElemType *elem;
int length;
int size;
}sqlist;
//初始化线性表
int initlist(sqlist *l) {
l->elem = (ElemType *)malloc(sizeof(ElemType) * INIT_LIST_SIZE);
if(l->elem == NULL) return FALSE;
l->length = 0;
l->size = INIT_LIST_SIZE;
return TRUE;
}
//向线性表的尾部添加数据
int addnode(sqlist *l,ElemType e) {
if(l->length >= l->size) {
ElemType *newbase;
newbase = (ElemType *)realloc(l->elem,(l->size + NODE_ADD_SIZE) * sizeof(ElemType));
if(newbase == NULL) return FALSE;
l->elem = newbase;
l->size += NODE_ADD_SIZE;
}
ElemType *p;
p = l->elem + l->length;
*p = e;
l->length += 1;
return TRUE;
}
//向线性表中插入数据
int insertnode(sqlist *l,int i,ElemType e) {
if(i<1 ||i>l->length) return FALSE;
if(l->length >= l->size) {
ElemType *newbase;
newbase = (ElemType *)realloc(l->elem,(l->size + NODE_ADD_SIZE) * sizeof(ElemType));
if(newbase == NULL) return FALSE;
l->elem = newbase;
l->size += NODE_ADD_SIZE;
}
ElemType *p,*q;
p = l->elem + l->length;
q = l->elem + i -1;
while(p > q) {
*p = *(p - 1);
p--;
}
*q = e;
l->length ++;
return TRUE;
}
//删除线性表中的特定位置的数据
int deletenodeindex(sqlist *l,int i,ElemType *e) {
if(i<1 || i>l->length) return FALSE;
ElemType *p,*q;
p = l->elem + i - 1;
q = l->elem + l->length -1;
*e = *p;//获得删除的值;
while(p<q) {
*p = *(p + 1);
p ++;
}
l->length --;
return TRUE;
}
//删除线性表中的某个数据,返回值为删除元素的个数
int deletenodevalue(sqlist *l,ElemType e) {
ElemType *p,*q;
p = l->elem;
q = l->elem + l->length - 1;
int i = 1;
int count = 0;
while(p<=q) {
if(*p == e) {
deletenodeindex(l,i,&e);
q --;//在此之前链表的长度已经改变,故不许要再让l->length --
count ++;
} else {
p ++;
i ++;
}
}
return count;
}
//输出线性表中的所有数据
void printflist(sqlist l) {
printf("listlength = %d ",l.length);
printf("listsize = %d ",l.size);
printf("\n");
int i;
for(i = 1;i<=l.length;i++) {
printf(" elem %d = ",i);
printf("%d",*l.elem);
l.elem ++;
}
printf("\n");
//将指针返回到线性表的基址
l.elem -= l.length;
}
/*
*以下是main方法对顺序表测试
*/
#include <stdio.h>
#include <stdlib.h>
#include "sq_list.h"
int main(void) {
//测试sq_list.h中的各种方法
/*struct sq_list l;
initlist(&l);
addnode(&l,1);
printflist(l);
addnode(&l,2);
printflist(l);
addnode(&l,2);
printflist(l);
insertnode(&l,2,10);
printflist(l);
addnode(&l,3);
printflist(l);
addnode(&l,4);
printflist(l);
ElemType e;
deletenodeindex(&l,2,&e);
printflist(l);
printf("e = %d \n",e);
int count = deletenodevalue(&l,2);
printflist(l);
printf("count = %d ",count);*/
//测试将两张线性表合并
/*struct sq_list la,lb,lc;
initlist(&la);
initlist(&lb);
initlist(&lc);
addnode(&la,4);
addnode(&la,3);
addnode(&la,2);
addnode(&la,1);
addnode(&lb,5);
addnode(&lb,6);
addnode(&lb,7);
twolisttoone(&la,&lb,&lc);
printflist(lc);
printflist(la);
printflist(lb);
*/
return 0;
}
C语言实现线性表
最新推荐文章于 2022-10-03 18:39:36 发布