1, Curriculum system
Concept
Sequence table, single chain table, one-way circular table, two-way circular table, queue, stack
Tree
Figure
Algorithm:
Search algorithm
2, Why learn data structures
1. Program = data structure + algorithm
Data structure is not only a very important thing to write code, but also a basic course
2. Data structure is a very important part of any programming language
For example, STL (Standard Template Library) in c + +
The essence of database is to write the content of data structure
The traversal algorithm of data graph is the basis of artificial intelligence
Red and black trees will be reflected in the drive
3, Concept of data structure
3.1 basic concepts
Data structure:
Data: research object
Structure: relationship between data
Data structure is mainly to study the relationship between data and data
In actual development, data structure is mainly used to temporarily store data in memory after understanding the relationship between data
3.2 definition of data structure
Data structure mainly studies the logical relationship, storage relationship and operation of data
3.3 logical relationship
Logical relationship mainly refers to the logical relationship between data, mainly refers to the collar relationship
Logical relationship involves the concepts of direct predecessor and direct successor when considering the relationship between data
Linear relationship: one-to-one relationship. Any data can only have one direct precursor and one direct successor
For example: linear table, stack, queue
Tree relationship: one to many relationship. Any data can only have one direct precursor, but can have multiple direct successors
For example: tree, binary tree
Graphical relationship (mesh relationship): many to many relationship. Any data has multiple direct precursors and multiple direct successors
For example: Figure
3.4 storage relationship
Storage relation refers to how data is stored in memory
Sequential storage:
Data in memory will open up a continuous memory space for storage. Generally, arrays are used to store data
Chained storage:
When data is stored in memory, it is not necessary to open up a continuous space.
Index storage (generally not used)
Hash storage (generally not used)
Note: in theory, any logical structure can be implemented in two storage methods.
3.5 operation
Add, delete and modify
4, Sequential table (sequential storage of linear table)
4.1 concept
Linear table: a one-to-one relationship between data and data
Sequential storage: it is necessary to open up a continuous memory space in memory to store data. Generally, arrays are used to store data. In order to facilitate the operation of arrays, a variable is usually defined to save the subscript of the last element
4.2 operation of sequence table
4.2.1 create an empty sequence table
#include <stdio.h> #include <stdlib.h> //In order to improve the expansibility of the code, alias the data type to facilitate the modification of the data in the table typedef int DataType; #define N 32 //Define a structure typedef struct { DataType data[N]; int pos; //Array subscript }seqlist; //Creation of sequence table seqlist *SeqlistCreate(); int main() { seqlist *st = SeqlistCreate(); return 0; } //Creation of sequence table seqlist *SeqlistCreate() { //Apply for space in the stacking area seqlist *st = (seqlist *)malloc(sizeof(seqlist)); //Initialization to identify that there are no elements in the current sequence table st->pos = -1; //Returns the first address of the sequence table return st; }
4.2.2 judge whether the sequence table is full
//Judge whether the sequence table is full int SeqlistFull(seqlist *st) { //Method 1 #if 0 if(st->pos == N - 1) { return 1; } else { return 0; } #endif //Method 2 return st->pos == N - 1 ? 1 : 0; }
4.2.3 insert data
//insert data void SeqlistInsert(seqlist *st,DataType value) { //Judge whether the sequence table is full if(SeqlistFull) { printf("The sequence table is full and cannot be inserted!\n"); return; } else { //Save the last element variable pos auto increment st->pos++; //Insert data into pos location st->data[st->pos] = value; printf("Successfully inserted!\n"); } }
4.2.4 traversal sequence table
//Traversal sequence table void SeqlistPrint(seqlist *st) { int i; for(i = 0;i <= st->pos;i++) { printf("%d",st->data[i]); } putchar(10); }
4.2.5 judge whether the sequence table is empty
//Judge whether the sequence table is empty int SeqlistNull(seqlist *st) { //There are two ways to judge whether it is full or not return st->pos == -1 ? 1 : 0; }
4.2.6 delete data and return deleted data
//Delete data and return deleted data DataType SeqlistDelete(seqlist *st) { if(SeqlistNull) { printf("The sequence table is empty and cannot be deleted!\n"); return (DataType) - 1; } else { DataType value = st->data[st->pos]; st->pos--; printf("Delete succeeded!\n"); return value; } }
4.2.7 insert data by location
//Insert data by location void SeqlistInsertByPos(seqlist *st,int p,DataType value) { if(SeqlistFull(st)) { printf("The sequence table is full and cannot be inserted!\n"); return; } //Determine whether the position can be inserted else if (p < 0 || p > st->pos +1) { printf("Incorrect position, failed to insert!\n"); return; } else { int i; //If the last bit is inserted, insert it directly if(p = st->pos + 1) { st->data[p] = value; st->pos++; } else { //The data after the insertion point is moved back one bit for ( i = st->pos; i > p; i--) { st->data[i + 1] = st->data[i]; } //insert data st->data[p] = value; st->pos++; } printf("Successfully inserted!\n"); return; } }
4.2.8 delete the data according to the location and return the deleted data
//Delete the data according to the location and return the deleted data DataType SeqlistDeleteByPos(seqlist *st,int p) { if(SeqlistNull(st)) { printf("The sequence table is empty and cannot be deleted!\n"); return (DataType) - 1; } //Judge whether the location can be deleted else if (p < 0 || p > st->pos +1) { printf("Incorrect location, deletion failed!\n"); return (DataType) - 1; } else { //Save the data to be deleted in value DataType value = st->data[p]; int i; //Move the data after the deletion position forward one bit for(i = p; i < st->pos;i++) { st->data[i] = st->data[i + 1]; } st->pos--; printf("Delete succeeded!\n"); return value; } }
4.2.9 modify data according to data
//Modify data according to data void SeqlistUpdateByData(seqlist *st,DataType OldValue,DataType NewValue) { int i,flag = 0; for(i = 0;i <= st->pos;i++) { if(st->data[i] == OldValue) { st->data[i] = NewValue; flag = 1; } } if(flag == 0) { printf("Failed to modify data%d non-existent!",OldValue); } }
4.2.10 modify data according to location
//Modify data by location void SeqlistUpdateByPos(seqlist *st,int p,DataType value) { if (p < 0 || p > st->pos +1) { printf("Incorrect location, modification failed!\n"); return; } else { st->data[p] = value; printf("Modification succeeded!\n"); } }
4.2.11 find location according to data
//Find location by data int SeqlistSearchByData(seqlist *st,DataType value) { int i; for ( i = 0; i <= st->pos; i++) { if(st->data[i] == value) { printf("Search succeeded!\n"); return i; } } printf("Failed to find data%d non-existent",value); return -1; }
4.2.12 find data by location
//Find data by location DataType SeqlistSearchByPos(seqlist *st,int p) { if (p < 0 || p > st->pos +1) { printf("Wrong location, search failed!\n"); return (DataType) -1; } else { printf("Search succeeded!\n"); return st->data[p]; } }
practice:
1. Delete duplicate data
(compare the first data with the following data, and delete the following data if there are duplicates)
s1: 1 2 2 2 1 1 3 4 2 4 5 4 1 -----> s1:1 2 3 4 5
//Delete duplicate data void SeqlistDeleteRepeat(seqlist *st) { int i,j; for(i = 0;i < st->pos;i++) { for(j = i + 1;j <= st->pos;j++) { if(st->data[i] == st->data[j]) { SeqlistDeleteByPos(st,j); j--; } } } }
2. Consolidated statement
(save the data different from s1 in s2 behind s1)
s1: 1 2 3 4 5
s2: 1 3 5 7 9
...
s1:1 2 3 4 5 7 9
//Consolidated statement void SeqlistMerge(seqlist *s1,seqlist *s2) { int i; for(i = 0;i < s2->pos;i++) { if(SeqlistSearchByPos(s1,s2->data[i]) == -1) { SeqlistInsert(s1,s2->data[i]); } } }
5, Advantages and disadvantages of sequence table
advantage:
The operation is simple, and the essence is an array.
Disadvantages:
It is necessary to open up a continuous memory space, so it is very inconvenient to store more data. When inserting or deleting data, the memory data will move in pieces, and the efficiency is very low.