线性表
线性表的定义
定义n个数据元素的有限序列,记作(a1, a2, …, an)ai 是表中数据元素,n 是表长度
线性表的特点
除第一个元素外,其他每一个元素有一个且仅有一个直接前驱。
除最后一个元素外其他每一个元素有一个且仅有一个直接后继。
顺序表的定义和特点
定义 将线性表中的元素相继存放在一个连续的存储空间中。
可利用一维数组描述存储结构
特点 线性表的顺序存储方式
遍历 顺序访问, 可以随机存取
内存存储方式:小端:低位存低地址 大端:高位存低地址
链表:
特点:1.每个元素(表项)由结点(Node)构成
2.线性结构
3.
结点可以连续,可以不连续存储
4.
结点的逻辑顺序与物理顺序可以不一致
5.
表可扩充
单链表:
typedef char ListData;
typedef struct node //链表结点
{
ListData data; //结点数据域
struct node * link; //结点链域
} ListNode;
typedef ListNode * LinkList;
LinkList first; //链表头指针
插入第一个:
newnode->next = first
first = newnode
插入链表中间:
newnode->next = p->next p->next = newnode
删除节点:
q = p->link; p->link = q->link; free q;
链表逆序(重要)(笔试考):
int ReverseLinkList( LinkList A ) { if (A==NULL) return 0; ListNode *p = A->next; A->next = NULL; while (p!=NULL) { ListNode *q = p; p = p->next; q->next = A->next; A->next = q; } return 1; }
循环链表:
循环链表是单链表的变形。 循环链表最后一个结点的 link指针不 为NULL,而是指向了表的前端。 为简化操作,在循环链表中往往加入表头结点。 循环链表的特点是:只要知道表中某一结点的地址,就可搜寻到所有其他结点的地址。
一个链表不知道头结点,有一个指针指向其中一个结点,请问如何删除这个指针指向的结点。
node *p; // 当前节点 node *q; q = p -> next; p.data = q.data; // 复制q节点到p p -> next = q -> next; // 删除q free(q);