线性表的基本操作
线性表是最常用且最简单得一种数据结构。简言之,一个线性表是n个数据元素得有限序列。
顺序存储实现
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
例:
linklist.h
//linklist.h
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include<stdio.h>
#include<stdlib.h>
typedef int datatype;
typedef struct node{
datatype data;
struct node *next;
}listnode,*linklist;
extern linklist list_create();//创建一个空链表
extern linklist list_create1();//尾插法创建
extern void list_show(linklist H);//输出
extern void list_reverse(linklist H);//倒序输出
extern linklist list_locate(linklist H,int pos);//按位置查找
extern linklist list_get(linklist H,datatype value);//按值查找
extern int list_delete(linklist H,int pos);//按位置删除
extern int list_insert(linklist H,int pos,datatype value);//按位置插入
extern int list_head_insert(linklist H,datatype value);//头插入
extern int list_order_insert(linklist H,datatype value);//顺序插入
extern void list_sort(linklist H);//排序
#endif
linklist.c
//linklist.c
#include"linklist.h"
linklist list_create(){
linklist H;
if((H=(linklist)malloc(sizeof(listnode)))==NULL){
printf("malloc failed!\n");
return H;
}
H->data = 0;
H->next = NULL;
return H;
}
linklist list_create1(){
linklist H,r,p;
int value;
if((H=(linklist)malloc(sizeof(listnode)))==NULL){
printf("malloc failed!\n");
return H;
}
H->data = 0;
H->next = NULL;
r = H;
while(1){
puts("input a number(-1 exit):");
scanf("%d",&value);
if(value == -1){
break;
}
if ((p = (linklist)malloc(sizeof(listnode)))==NULL){
puts("malloc failed!");
return H;
}
p->data = value;
p->next = NULL;
r->next = p;
r = p;
}
return H;
}
void list_show(linklist H){
while(H->next){
printf("%d\t",H->next->data);
H=H->next;
}
puts("");
}
linklist list_locate(linklist H,int pos){
linklist p = H;
int i = -1;
if(pos<0){
puts("position is invalid:<0");
return NULL;
}
while(p->next && i<pos){
p=p->next;
i++;
}
if(i==pos)
return p;
else{
puts("position is invalid:> length\n");
return NULL;
}
}
linklist list_get(linklist H,datatype value){
linklist p = H->next;
while(p && p->data != value){
p=p->next;
}
return p;
}
int list_head_insert(linklist H,datatype value){
linklist p;
if((p=(linklist)malloc(sizeof(listnode)))==NULL){
printf("malloc failed!\n");
return -1;
}
p->data = value;
p->next = H->next;
H->next =p;
return 0;
}
int list_insert(linklist H,int pos,datatype value){
linklist p,q;
if(pos == 0){
p = H;
}
else{
p =list_get(H,pos-1);
}
if(p == NULL){
printf("para is invalid\n");
return -1;
}
else{
if ((q = (linklist)malloc(sizeof(listnode)))==NULL){
printf("malloc failed\n");
return -1;
}
q->data = value;
q->next = p->next;
p->next = q;
return 0;
}
}
int list_delete(linklist H,int pos){
linklist p,q;
if(pos == 0){
p = H;
}
else{
p=list_get(H,pos-1);
}
if(p == NULL || p->next == NULL){
printf("para is invalid\n");
return -1;
}
else {
q = p->next;
p->next = q->next;
free(q);
q = NULL;
return 0;
}
}
void list_reverse(linklist H){
linklist p,q;
p=H->next;
H->next = NULL;
while(p){
q = p;
p = p->next;
q->next = H->next;
H->next = q;
}
}
int list_order_insert(linklist H,datatype value){
linklist p,q;
if ((p=(linklist)malloc(sizeof(listnode))) == NULL){
puts("malloc failed");
return -1;
}
p->data = value;
q=H;
while(q->next && q->next->data < value){
q = q->next;
}
p->next = q->next;
q->next = p;
return 0;
}
void list_sort(linklist H){
linklist p,q,r;
p = H->next;
H->next = NULL;
while(p){
q=p;
p = p->next;
r = H;
while (r->next && r->next->data < q->data){
r= r->next;
}
q->next = r->next;
r->next = q;
}
}
Makefile和test.c请自行书写测试