//假定线性表的表元素类型为DataType constint Maxsize = 7; //预先定义数组大小 typedefstruct { int num; //学号 char name[8]; //姓名 char sex[2]; //性别 int age; //年龄 int score; //入学成绩 } DataType; //定义结点的类型
顺序表插入、删除和定位运算的实现算法。
插入
1 2 3 4 5 6 7 8 9 10 11 12
voidInsertSeqList(SeqList L, DataType x, int i) { //将元素x插入到顺序表L的第i个元素之前 int j; if (L.length == Maxsize) exit("表已满"); if (i < 1 || i > L.length + 1) //检查插入位置是否合法 exit("位置错"); for (j = L.length; j > i; j--) //初始i=L.length L.data[j] = L.data[j - 1]; //依次后移 L.data[i - 1] = x; //元素x放到下标为i-1的位置 L.length++; //表长度加1 }
删除
1 2 3 4 5 6 7 8 9
voidDeleteSeqList(SeqList L, int i) { //删除线性表 L 中的第 i 个数据结点 int j; if (i < 1 || i > L.length) //检查位置合法性 exit("非法位置"); for (j = i; j < L.length; j++) //第 i 个元素的下标为 i-1 L.data[j - 1] = L.data[j]; //依次左移 L.length--; //表长度减一 }
定位
1 2 3 4 5 6 7 8 9 10
intLocateSeqList(SeqList L, DataType x) { int i = 0; while ((i < L.length) && L.data[i] != x) //在顺序表中查找值为x的结点 i++; if (i < L.length) //若找到值为x的元素,返回元素的序号 return i + 1; else//若未找到值为x的元素,返回0 return0; }
Node *GetLinkList(LinkList head, int i) { //在单链表查找第i个元素结点,找到返回该节点指针,否则返回NULL Node *p; //工作指针 p = head->next; //初始指向首结点 int c = 1; while ((c < i) && (p != NULL)) { //当未到i结点和尾结点是继续后移 p = p->next; c++; } if (i == c) //找到第i个结点 return p; else returnNULL; //i值不合法 }
定位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
intLocateLinkList(LinkList head, DataType x) { //求表中第一个值为x的结点的序号,若找不到,返回0 Node *p = head; p = p->next; int i = 0; while (p != NULL && p->data != x) { i++; p = p->next; } if (p != NULL) return i + 1; else return0; }
插入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
voidInsertLinkList(LinkList head, DataType x, int i) { //在表head的第i个元素之前插入一个值为x的新结点 Node *p, *q; if (i == 1) q = head; else q = GetLinkList(head, i - 1); //找第i-1个元素结点 if (q == NULL) //第i-1个结点不存在 exit("找不到插入的位置"); else { p = malloc(sizeof(Node)); //生成新的结点 p->data = x; p->next = q->next; //新结点链域指向*q的后继结点 q->next = p; //修改*q的链域 } }
删除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
voidDeleteLinkList(LinkList head, int i) { //删除表head中地i的结点 Node *q, *p; if (i = -= 1) q = head; else q = GetLinkList(head, i - 1); //找到待删除的结点的直接前驱 if (q != NULL && q->next != NULL) //若直接前驱存在且待删除结点也存在 { p = q->next; //p指向待删除结点 q->next = p->next; //待删除结点的直接前驱指向待删除结点的直接后继 free(p); //释放已经移除链表的结点p的空间 } else exit("找不到要删除的结点"); //结点不存在 }