线性结构:
特点:
1头儿 只有没有前驱只有后继
2中间的 既有前驱也有后继
3尾 没有后继只有前驱
4逻辑相邻,物理也相邻。
常用的:
线性表(顺序表,链表)
栈
队列
存储结构:
定义顺序表——数组
建表——查询——增删改查
单向链表:
1.新建链表
C语言结构体:
struct node
{
int data;
struct node *next;
}
struct node *p1,*p2,*p3;
p1 = new node;
p1->data = a1;
p2 = new node ;
p2->data = a2;
... 这样写太复杂,可以用队列或者栈的循环来写
2.链表查询
第一步:如果没找到这个数据,p=p->next
while(p->data!=a3)
p=p->next
3.链表插入
插入S结点:
第一步:指向a3前面结点。
第二步:先连后断。
while(p->next->data!=a3)
p=p->next
s->next = p->next
p-next = s
4.链表的删除
第一步:找到a3前面的结点p,
第二步:Q为p的下一个结点,q的下一个结点是p的下一个结点
while(p->next->data!=a3)
p=p->next
q=p->next;
p->next=q->next;
5.链表逆序
链表逆序的循环算法:
设置prev=NULL,next这两个指针,next为head->next ,让head的next为prev,这时A就从链表中脱离出来,然后prev,head,next 向前推进,
让prev为head,head为next,
下一步
循环的终止条件是head指针为NULL。
link_NODE * reverse(link_NODE *head)
{
LINK_NODE *next;
LINK_NODE *prev = NULL;
while(head!=NULL)
{
next = head->next;
head->next = prev;
prev = head;
head = next;
}
return prev;
}
自己蒙着眼睛写一个-。-
//递归调用 Node * reverseRecursion(Node *head) { if (head == NULL||head->next == NULL) { return head; } Node *second = head->next; head->next = NULL; Node *rest = reverseRecursion(second); second->next = head; return rest; }
