#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <iostream>
using namespace std;
#define ElementType int
#define LIST_INCREMENT 50
#define Status bool
#define ERROR false
#define OK true
#define INITIALSIZE 50;
typedef struct SequenceList {
ElementType *datas;
ElementType listsize;
ElementType length;
}SeqList;
typedef struct LinkedList {
LinkedList *next;
LinkedList *prev;
ElementType data;
}*LinkList;
/**
* @brief 插入链表
*
* @param seqList
* @param i
* @param x
*
* @return
**/
Status LinkInsert(SeqList *seqList,int i,ElementType x){
if(i <1 || i >= seqList->listsize + 1){
return ERROR;
}
if(seqList->listsize > seqList->length){
ElementType *newBase
= (ElementType*)realloc(seqList->datas,(seqList->listsize + LIST_INCREMENT)*sizeof(ElementType));
if(!newBase){
return ERROR;
}else {
seqList->datas = newBase;
seqList->datas[i]= x;
seqList->listsize += LIST_INCREMENT;
}
}
seqList->datas[i-1] = x;
seqList->length++;
return OK;
}
/**
* @brief 初始化顺序表
*
* @param seq
*
* @return
**/
SeqList* initList(SeqList *seq){
seq->length=0;
seq->listsize = INITIALSIZE;
ElementType capcity = sizeof(ElementType)*INITIALSIZE;
seq->datas= (ElementType*)malloc(capcity);
return seq;
};
/**
* @brief 删除单链表的中的元素
*
* @param seq
* @param i
* @param x
*
* @return
**/
Status deleteEle(SeqList *seq,ElementType i,ElementType x){
if(i < 1 || i > seq->length){
return ERROR;
}
x = seq->datas[i-1];
ElementType *p = &(seq->datas[i - 1]);
ElementType *q = &(seq->datas[0]) + seq->length - 1;
for(++p;p < q;++p){
*(p-1) = *p;
}
seq->length--;
return OK;
}
/**
* @brief 头插法建立单链表
*
* @param L
* @param n
*
* @return
**/
LinkedList* createList(LinkedList *L,ElementType n){
L->next = NULL;
for(int i = n; i>=0; i--){
LinkList p = (LinkList)malloc(sizeof(LinkList));
p->data = i;
p->next = L->next;
L->next = p;
}
return L;
}
/**
* @brief 尾插法建立单链表
*
* @param head
*
* @return
**/
LinkedList* createListR(LinkList head) {
if(head == NULL){
head = (LinkList)malloc(sizeof(LinkList));
}
LinkedList *r = head;
LinkedList *s;
char ch;
while((ch = getchar())!='\n'){
s = (LinkList)malloc(sizeof(LinkList));
s->data = ch;
r->next = s;
r= s;
}
r->next = NULL;
return head;
}
/**
* @brief 合并顺序表
*
* @param p
* @param q
* @param r
*
* @return
**/
SeqList* mergeSeq(SeqList *p,SeqList *q,SeqList *r){
ElementType *pa = &(p->datas[0]);
ElementType *pb = &(q->datas[0]);
ElementType *pc = &(r->datas[0]);
ElementType *plast = &(p->datas[0]) + p->length;
ElementType *qlast = &(q->datas[0]) + q->length;
r->length = p->length + q->length;
if(!r){
exit(0);
}
while(pa < plast || pb < qlast){
if(*pa < *pb){
*(pc++) = *(pa++);
}else {
*(pc++)= *(pb++);
}
}
while(pa < plast){
*(pc++) = *(pa++);
}
while(pb < qlast){
*(pc++) = *(pb++);
}
return r;
}
/**
* @brief 删除链表元素
*
* @param list
* @param pos
*
* @return
**/
Status deleteLinkList(LinkList list,ElementType pos){
LinkList p = list;
ElementType j = 0;
while(p->next && j < pos){
p = p->next;
++j;
}
if(!p){
return ERROR;
}
LinkList q = p->next;
p->next = q->next;
free(p);
return OK;
}
int main(){
SeqList *seq = (SeqList*)malloc(sizeof(SeqList));
seq = initList(seq);
printf("ele is %d\n", seq->datas[0]);
printf("ele is %d\n", seq->length);
printf("ele is %d\n", seq->listsize);
for(int i = 0; i <10;i++){
LinkInsert(seq,i,i);
}
printf("size is %d\n", seq->length);
ElementType r = -1;
deleteEle(seq,3,r);
printf("ele size is %d",seq->length);
SeqList *l1 = (SeqList*)malloc(sizeof(SeqList));
SeqList *l2 = (SeqList*)malloc(sizeof(SeqList));
SeqList *l3 = (SeqList*)malloc(sizeof(SeqList));
initList(l1);
initList(l2);
initList(l3);
for(int i = 0; i <10;i++){
LinkInsert(l1,i,i);
}
for(int i = 0; i <10;i++){
LinkInsert(l2,i,i+10);
}
l3 = mergeSeq(l1,l2,l3);
for(int i = 0; i < l3->length; i++){
printf("ele is %d\n",l3->datas[i]);
}
free(l1);
free(l2);
free(l3);
LinkList list = (LinkList)malloc(sizeof(LinkList));
list = createList(list,10);
//deleteLinkList(list,3);
while(list!=NULL){
printf("ele data is %d\n",list->data);
list = list->next;
}
LinkList head = (LinkList)malloc(sizeof(LinkList));
head = createListR(head);
printf("ele char is %c",head->next->data);
return 0;
}
数据结构顺序表的插入删除
于 2023-04-12 20:39:33 首次发布