前言
搁置了这么久,总算决定腾出时间整理一下数据结构,就先从线性表开始吧
顺序表(线性表的顺序存储):
#include<stdio.h>
#define MAXSIZE 1000013
//存储结构
typedef int ElemType;
typedef struct {
ElemType elem[MAXSIZE];
int length;
}SeqList;
void Init_SeqList(SeqList* L);//初始化
int Insert_SeqList(SeqList* L,int i,ElemType x); //顺序表的插入
int Delete_SeqList(SeqList* L,int i,ElemType* x); //顺序表的删除
int Location_SeqList(SeqList* L,ElemType x); //按值查找
void merge(SeqList* A,SeqList* B,SeqList* C); //合并两个顺序表
int main(){
//此部分省略
}
void Init_SeqList(SeqList* L) {
L->length = 0;
}
int Insert_SeqList(SeqList* L,int i,ElemType x) {
int j;
if(L->length == MAXSIZE -1 ){
printf("表满!");
return 0;
}
if(i<1 || i>L->length+1 ){
//检查插入位置合法性
printf("位置错!")
return 0;
}
for(j=L->length;j>=i;j--){
//给要插入的位置腾出空间
L->elem[j+1] = L->elem[j];
}
L->elem[i] = x;
L->length++;
return 1;
}
int Delete_SeqList(SeqList* L,int i,ElemType* x) {
int j;
if(i<1 || i>L->length){
printf("不存在第i个元素");
return 0;
}
*e = L->elem[i];
for(j=i;j<=L->length-1;j++){
//从第i处开始全体前移
L->elem[j] = L->elem[j+1];
}
L->length--;
return 1;
}
int Location_SeqList(SeqList* L,ElemType x) {
int i = 1;
while(i<=L->length && L->elem[i] != x){
i++;
}
if(i>L->length) return 0;
else return i;
}
void merge(SeqList* A,SeqList* B,SeqList* C) {
// A,B都是升序,合并后的C也是升序
int i,j,k;
i=1,j=1,k=1;
while(i<=A->length && j<=B->length){
if(A->elem[i] <= B->elem[j]){
C->elem[k++] = A->elem[i++];
} else {
C->elem[k++] = B->elem[i++];
}
while(i <= A->length){
C->elem[k++] = A->elem[i++];
}
while(j <= B->length){
C->elem[k++] = B->elem[j++];
}
C->length = A->length + B->length;
}
}
单链表:
#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
typedef struct node {
DataType data; //数据域
struct node* next; //指针域
}LNode,*LinkList;
LinkList Creat_LinkListH();//头插法建立单链表
LinkList Creat_LinkListT();//尾插法建立单链表
int Length_LinkList(LinkList H);//求单链表的长度
void Print_List(LinkList H);//打印单链表
LinkList Get_LinkList(LinkList H,int k);//单链表按序号查找
LNode* Locate(LinkList H,int x);//单链表按值查找
int Insert_LinkList(LinkList H,int i,int x);//单链表的插入
int Del_LinkList(LinkList H,int i);//单链表的删除
void Reverse(LinkList H);//单链表的逆置
void Pur_LinkList(LinkList H);//删除单链表重复元素
void Difference(LinkList H); //两个链表的差
int main() {
// 主函数省略
}
LinkList Creat_LinkListH() {
LinkList H = (LinkList)malloc(sizeof(LNode)); // 生成头结点
H->next = NULL;
LNode* s;
int x;
scanf("%d",&x);
while(x != -1){
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
s->next = H->next;
H->next = s;
scanf("%d",&x);
}
return H; //返回头指针
}
LinkList Creat_LinkListT() {
LinkList H = (LinkList)malloc(sizeof(LNode));
H->next = NULL;
LNode *s,*r = H;
int x;
scanf("%d",&x);
while(x != -1){
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d",&x);
}
r->next = NULL;
return H;
}
void Print_List(LinkList H) {
LNode* p = H->next;
while(p){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int Length_LinkList(LinkList H) {
LNode* p = H;
int j = 0;
while(p->next){
p=p->next;
j++;
}
return j;
}
LinkList Get_LinkList(LinkList H,int k) {
LNode* p = H;
int j = 0;
while(p->next && j<k){
p=p->next;
j++;
}
if(j==k) return p;
else return NULL;
}
LNode* Locate(LinkList H,int x) {
LNode* p = H->next;
while(p && p->data != x){
p=p->next;
}
return p;
}
int Insert_LinkList(LinkList H,int i,int x) {
// 在单链表第i个位置上,插入值为x的新结点
LNode* p,*s;
p=Get_LinkList(H,i-1);//查找第i-1个结点
if(!p){
printf("插入位置错误!\n");
return 0;
} else {
s = (LinkList)malloc(sizeof(LNode));//申请新结点
s->data = x;
s->next = p->next;
p->next = s;
return 1;
}
}
int Del_LinkList(LinkList H,int i) {
//删除单链表H上的 第 i 个结点
LinkList p,q;
p=Get_LinkList(H,i-1); //拿到第 i-1 个结点
if(!p){
printf("第i-1个结点不存在\n");
return 0;
} else if(p->next == NULL){
printf("第i个结点不存在\n");
return 0;
} else {
q = p->next;//指向第i个结点
p->next = q->next; // 删除
free(q);
return 1;
}
}
void Reverse(LinkList H) {
LNode *p,*q;
p = H->next;
H->next = NULL;
while(p){
// 利用头插法存储 数据逆着存储 特点 实现逆置
q = p;
p=p->next;
q->next = H->next;
H->next = q;
}
}
void Pur_LinkList(LinkList H) {
// 删除单链表重复结点
LNode *p,*q,*r;
p = H->next;
if(p){
while(p->next){
q = p;
while(q->next){
if(q->next->data == p->data){
r = q->next;
q->next = r->next;
free(r);
} else {
q = q->next;
}
}
p = p->next;
}
}
}