运城网站建设公司有多少世界球队最新排名
定义
线性表的链式存储不需要用连续的存储单元来实现,不需要逻辑上相邻的两个数据元素在物理上也相邻,它是通过链建立其数据元素之间的逻辑关系,因此对线性表的插入、删除不需要移动数据元素,只需要修改连。
为了访问链表,必须找到链表的第一个数据单元,因此实际应用中常用一个称为“表头(Header)”的指针指向链表的第一个单元,并用它表示一个具体的链表。
结点的结构定义
typedef int ElementType;
typedef struct LNode* PtrToLNode;
typedef PtrToLNode Position;
typedef PtrToLNode List;struct LNode {ElementType Data;PtrToLNode Next;
};
相关操作
初始化
List MakeEmpty(List L) {L = (LNode*)malloc(sizeof(LNode));L->Next = NULL;return L;
}
插入
bool Insert(List L, ElementType X, int i) {int cnt = 0;List p = L;//printf("p: %d\n", p->Data);while (p != NULL && cnt != i-1) {p = p->Next;cnt++;}//printf("cnt: %d\n", cnt);if (p == NULL || cnt != i - 1) {printf("insert error!\n");return false;}else {List temp = (LNode*)malloc(sizeof(LNode) * 1);temp->Data = X;temp->Next = p->Next;p->Next = temp;}return true;}
求表长
int ListLength(List L) {int length = 0;List p = L->Next;while (p != NULL) {p = p->Next;length++;}return length;}
查找
按序号查找
ElementType Findkth(List L, int K) {//找到第i个结点的值List p = L->Next;int i = 1;while (p != NULL && i != K) {p = p->Next;i++;}if (p == NULL || i != K) {printf("can't find!\n");return -1;}else {return p->Data;}}
按值查找
Position Find(List L, ElementType X) {//由数值返回其结点位置List p = L->Next;while (p != NULL && p->Data !=X) {p = p->Next;}if (p->Data == X) {return p;}else{return NULL;}}
删除
bool Deletei(List L, int i) {//删除第i个结点List p=L, q = L;int cnt = 0;while (p != NULL && cnt!=i) {cnt++;q = p;p = p->Next;}if (p == NULL || cnt != i) {return false;}q->Next = p->Next;free(p);return true;}
完整代码
# include <stdio.h>
# include <stdlib.h>typedef int ElementType;
typedef struct LNode* PtrToLNode;
typedef PtrToLNode Position;
typedef PtrToLNode List;struct LNode {ElementType Data;PtrToLNode Next;
};List MakeEmpty(List L) {L = (LNode*)malloc(sizeof(LNode));L->Next = NULL;return L;
}bool Insert(List L, ElementType X, int i) {int cnt = 0;List p = L;//printf("p: %d\n", p->Data);while (p != NULL && cnt != i-1) {p = p->Next;cnt++;}//printf("cnt: %d\n", cnt);if (p == NULL || cnt != i - 1) {printf("insert error!\n");return false;}else {List temp = (LNode*)malloc(sizeof(LNode) * 1);temp->Data = X;temp->Next = p->Next;p->Next = temp;}return true;}
void print_link(List L) {List p = L->Next;while (p != NULL) {printf("Node : %d\n", p->Data);p = p->Next;}}int ListLength(List L) {int length = 0;List p = L->Next;while (p != NULL) {p = p->Next;length++;}return length;}ElementType Findkth(List L, int K) {//找到第i个结点的值List p = L->Next;int i = 1;while (p != NULL && i != K) {p = p->Next;i++;}if (p == NULL || i != K) {printf("can't find!\n");return -1;}else {return p->Data;}}Position Find(List L, ElementType X) {//由数值返回其结点位置List p = L->Next;while (p != NULL && p->Data !=X) {p = p->Next;}if (p->Data == X) {return p;}else{return NULL;}}bool Deletei(List L, int i) {//删除第i个结点List p=L, q = L;int cnt = 0;while (p != NULL && cnt!=i) {cnt++;q = p;p = p->Next;}if (p == NULL || cnt != i) {return false;}q->Next = p->Next;free(p);return true;}int main() {List L = NULL;L = MakeEmpty(L);printf("Finish init!\n");ElementType X;int N;scanf_s("%d", &N);while (N--) {scanf_s("%d", &X);if (Insert(L, X, 1) == false) {printf("insert error!\n");}}print_link(L);int length = ListLength(L);printf("the list's length: %d\n", length);/*int x = Findkth(L, 2);printf("find: %d\n", x);List p = Find(L, 5);printf("findp: p->data: %d\n", p->Data);*/if (bool(Deletei(L, 2))) {printf("Delete Sucessfully!\n");}print_link(L);length = ListLength(L);printf("the list's length: %d\n", length);}