以下是学习知识点的记录,方便自己复习,若有错误,请前辈们指正,谢谢!
用结构体类型定义顺序表:
#define listsize 100
typedef int typedata; //typedata相当于int的别名,像一个人的外号和名字都是指那个人
typedef struct
{
typedata data[listsize]; //相当于 int data [listsize]
int length;
} Seqlist;
创建结构体对象:
Seqlist *seqlist =new Seqlist();
添加数据:
void sequencelist::addSeqlist(int num)
{
seqlist->data[seqlist->length] = num;
seqlist->length++;
}
int sequencelist::getLength()
{
return seqlist->length;
}
int sequencelist::getData(int num)
{
int lengh = seqlist->length;
if (num<0 || num>lengh)
{
cout << "错误:" << "位置 " << num << "无效" << endl;
return 0;
}
else
{
return seqlist->data[num];
}
}
插入数据:
int sequencelist::insertSeqlist(int values, int index)
{
int length = seqlist->length;
if (length>=listsize)
{
cout << "错误:" << "溢出" << endl;
return 0;
}
else if (index<0||index>length)
{
cout << "错误:" << "插入位置 "<< index << "无效" << endl;
return 0;
}
else
{
for (int i = 0; i < length - index; i++)
{
seqlist->data[length - i] = seqlist->data[length - i - 1];
}
seqlist->data[index] = values;
seqlist->length++;
return 1;
}
}
替换某点的数据:
void sequencelist::setSeqlist(int values,int num)
{
if (num<0 ||(num>seqlist->length))
{
cout << "错误:" << "该位置 " << num << "无效" << endl;
return;
}
seqlist->data[num] = values;
}
删除某个点:
int sequencelist::deleteSeqlist(int index)
{
int lengh = seqlist->length;
if (index<0 || index>lengh)
{
cout << "错误:" << "位置 " << index << "无效" << endl;
return 0;
}
else
{
for (int i = 0; i < lengh - index; i++)
{
seqlist->data[index + i] = seqlist->data[index + i + 1];
}
seqlist->length--;
return 1;
}
}
删除所有数据:
void sequencelist::deleteAllSeqlist()
{
int length = seqlist->length;
for (int i = 0; i < length; i++)
{
seqlist->data[i] = NULL;
seqlist->length--;
}
}
代码整合:https://share.weiyun.com/28820443cac6e38afb9393c649ad1a21
用结构体类型定义链表:
.h文件:
typedef struct node
{
char data;
struct node *next;
}linkelist;
linkelist *head, *last, *p;
1、 当head指针为NULL时,建立新空间,并把空间0的地址给head指针,由于开始只有一个空间,所以last = head,last也指向head指向的空间0。
2、 head的空间0被建立之后,开始建立下一个空间1给p指针,由于last指向了和head相同的空间0,所以用last->next = p;将p空间1的地址给head空间0的next指针,然后让last指向p指向的空间1。
3、再新建一个空间2,并将地址给p指针,此时last指向了上一个的空间1,而p指向了刚建立的空间2,所以last->next = p;将新空间2的地址给上一个空间1的next指针,然后再让last指向p空间2的位置。
void addlist(char data)
{
if (head == NULL)
{
head = (linkelist*)malloc(sizeof(linkelist));
head->next = NULL;
last = head;
}
p = (linkelist*) malloc(sizeof(linkelist));
p->data = data;
p->next = NULL;
last->next = p;
last = p;
}
获取某点的数据:
char getlist(int num)
{
linkelist *temp = head->next;
for (int i = 0; i < num; i++)
{
temp = temp->next;
}
return temp->data;
}
获取某个数据的位置:
int getindex(char num)
{
int i = 0;
linkelist *temp = head->next;
while (temp->data != num)
{
i++;
temp = temp->next;
}
return i;
}
向指定位置插入数据:
void insertlist(int index, char values)
{
linkelist *temp = head;
linkelist *np = (linkelist*)malloc(sizeof(linkelist));
for (int i = 0; i < index; i++)
{
temp = temp->next;
}
np->data = values;
np->next = NULL;
np->next = temp->next;
temp->next = np;
}
得到链表的长度:
int getlenght()
{
int lenght = 1;
linkelist *temp = head->next;
while (temp->next!=NULL)
{
lenght++;
temp = temp->next;
}
return lenght;
}
替换指定位置的数据:
void setlist(int index, char values)
{
linkelist *temp = head->next;
for (int i = 0; i < index; i++)
{
if (temp->next != NULL)
{
temp = temp->next;
}
else
{
printf("(%d)该位置不存在\n",index);
return;
}
}
temp->data = values;
}
删除指定位置:
void deletelist(int index)
{
linkelist *temp = head;
linkelist *d;
for (int i = 0; i < index; i++)
{
temp = temp->next;
}
if (temp->next->next != NULL)
{
d = temp->next;
temp->next = temp->next->next;
free(d);
}
else
{
d = temp->next;
temp->next = NULL;
free(d);
}
}
代码整合: https://share.weiyun.com/f6e5ae6f657100d061800e399f8b0c29
用结构体类型定义双向循环链表:
.h文件
#pragma once
typedef struct node
{
struct node *previous;
int data;
struct node *next;
}doublelist;
class doublelinkedlist
{
public:
doublelinkedlist();
~doublelinkedlist();
void add(int values);
int getlenght();
int getvalues(int index);
int getvalues2(int index);
void insertlist(int index, int values);
void deletelist(int index);
void setvalues(int index, int values);
void deleteAll();
private:
doublelist *p, *head, *last;
int length;
};
原理和单链表一样,就多了previous指针的指向
添加数据:
void doublelinkedlist::add(int values)
{
if (head == NULL)
{
head = (doublelist*)malloc(sizeof(doublelist));
head->data = values;
last = head;
length++;
}
else
{
p = (doublelist*)malloc(sizeof(doublelist));
p->data = values;
p->previous = last;
last->next = p;
last = p;
last->next = head;
head->previous = last;
length++;
}
}
获取长度:
int doublelinkedlist::getlenght()
{
return length;
}
获取指定位置的数据:
int doublelinkedlist::getvalues(int index)
{
doublelist *temp = head;
if (temp == NULL)
{
return 0;
}
else if (index>length-1|index<0)
{
printf("getvalues失败:%d无效位置\n", index);
}
for (int i = 0; i < index; i++)
{
temp = temp->next;
}
return temp->data;
}
获取指定位置的数据2:
int doublelinkedlist::getvalues2(int index)
{
doublelist *temp = head;
if (temp == NULL)
{
return 0;
}
else if (index<0)
{
printf("getvalues2失败:%d无效位置\n", index);
return 0;
}
else if (index <= length / 2){
for (int i = 0; i < index; i++)
{
temp = temp->next;
}
return temp->data;
}
else if (index<length)
{
temp = last;
for (int i = 0; i < length - index - 1; i++)
{
temp = temp->previous;
}
return temp->data;
}
else
{
printf("getvalues2失败:%d无效位置\n", index);
return 0;
}
}
void doublelinkedlist::insertlist(int index, int values)
{
doublelist *temp = head->previous;
if (index>length)
{
printf("insertlist失败:插入无效(%d)\n", index);
return;
}
for (int i = 0; i < index; i++)
{
temp = temp->next;
}
p = (doublelist*)malloc(sizeof(doublelist));
p->next = temp->next;
temp->next->previous = p;
p->data = values;
p->previous = temp;
temp->next = p;
length++;
if (index == 0)
{
head = p;
}
if (index == length - 1)
{
last = p;
}
}
删除指定位置的数据:
void doublelinkedlist::deletelist(int index)
{
doublelist *temp = head;
for (int i = 0; i < index; i++)
{
temp = temp->next;
}
temp->previous->next = temp->next;
temp->next->previous = temp->previous;
if (index == 0)
{
head = temp->next;
}
if (index == length - 1)
{
last = temp->previous;
}
free(temp);
length--;
}
void doublelinkedlist::setvalues(int index, int values)
{
if (index <= length / 2){
doublelist *temp = head;
for (int i = 0; i < index; i++)
{
temp = temp->next;
}
temp->data = values;
}
else if (index<length)
{
doublelist *temp = last;
for (int i = 0; i < length - index - 1; i++)
{
temp = temp->previous;
}
temp->data = values;
}
else
{
printf("setvalues失败:%d无效位置\n", index);
return;
}
}
删除所有数据:
void doublelinkedlist::deleteAll()
{
doublelist *temp = head;
doublelist *r;
int k = length;
for (int i = 0; i < k; i++)
{
r = temp;
temp = temp->next;
free(r);
length--;
}
head = NULL;
last = head;
}
代码整合: https://share.weiyun.com/14a57933286e5a54441dfc30cddbccf1