赞
踩
1.顺序表的存储空间为静态分配,需要预先规定存储规模,存储空间大小开辟不好把握,但是顺序表的存储密度高,存储空间利用率高
2.顺序表是一种随机存储结构,可以在O(1)时间内完成对元素的存取,但是删除和插入操作时,需要移动插入位置后的所有元素
1.单链表的存储有静态存储和动态存储,动态存储时,只要内存尚有余额,不会产生溢出,但是存储密度会下降,存储空间利用率不高
2.单链表的元素存取需要从头结点开始逐个查找指定元素,但是插入和删除操作只需要修改指针指向即可
头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针,头结点是单链表中指向第一个元素结点的结点,元素结点是链表中除头结点以外的存储元素的结点
A .双向链表
B .双向循环链表
C .单向循环链表
D .顺序表
A .插入和删除运算不需要移动元素
B .所需要的存储空间与线性表的长度成正比
C .不必事先估计存储空间大小
D .可以随机访问表中的任意元素
A .头指针的单向循环链表
B .双向链表
C .带尾指针的单向循环链表
D .带头指针双向循环链表
A .线性表采用顺序存储必须占用一片连续的存储空间
B .线性表采用链式存储不必占用一片连续的存储空间
C .线性表采用链式存储便于插入和删除操作的实现
D .线性表采用顺序存储便于插入和删除操作的实现
A . head ==0
B . head -> next ==0
C . head -> next == head
D . head !=0
A . head == NULL
B . head -> next == NULL
C . head -> next == head
D . head != NULL
A . n - i
B . n +1- i
C . n -1- i
D . i
B . head -> next == NULL
A . head -> prior == NULL
D . head -> next -> prior == NULL
C . head -> next == head
A . p -> next = p -> next -> next ; free ( p -> next );
B . free ( p -> next ); p -> next = p -> next -> next ;
C . p = p -> next ;
D . s = p -> next ; p -> next = s -> next ; free ( s );
A . Base +( i -1) x m
B . Base + i x m
C . Base - i x m
D . Base +( i +1) x m
- #define MaxSize 100
-
- typedef struct SqList{
- int data[MaxSize];
- int length;
- }SqLsit;
-
- void insert(SqList *list,int elem){
- //顺序表递增有序
- //判断数组长度
- if(list->length == MaxSize){
- return ; //数组已满,插入失败
- }
- //倒序遍历数组,
- //如果要插入元素elem小于当前元素,则将当前元素后移一位
- //如果要插入元素elem大于等于当前元素,则将当前元素后移一位后将elem赋值到当前位置
- for(int i=list->length-1;i>=0;i--){
- if(elem < list->Data[i]){
- list->data[i+1] = list->data[i];
- }else{
- list->data[i+1] = list->data[i];
- list->data[i] = elem;
- list->length++;
- return ; //插入成功
- }
- }
-
- }
- #define MaxSize 100
-
- //定义顺序表
- typedef struct SqList{
- int data[MaxSize];
- int length;
- }SqList;
-
- int delet_fromicountk(SqList *list,int i,int k){
- //删除顺序表list中从i开始的往后k个元素
- //首先判断i和k值的合法性
- if(i>list->length || i<=0 || k<=0){
- return 0; //插入失败
- }
-
- //分情况对顺序白哦进行删除操作
- //两种情况
- //i+K-1 < list->length 此时将后面元素前移
- //i+k-1 >= list->length 此时删除i位后面所有元素
- if(i+k-1 >= list->length){
- //此时将顺序表长度减k即可
- list->length = list->length - k;
- }else{
- int index = i;
- for(int j=list->length-1;j>=i+k-1;j--){
- list->data[index++] = list->data[j];
- }
- }
- return 1; //执行成功
-
- }
- #define MaxSize 100
-
- typedef struct SqList{
- int data[MaxSize];
- int length;
- }SqList;
-
-
- void merge(Sqlist *l1,SqList *l2,SqList *l3){
- //假设顺序表足够大,不会产生溢出
- //使用双指针倒序遍历两个顺序表
- int i = l1->length-1;
- int j = l2->length-1;
- int k = 0;
- while(i>=0&&j>=0){
- if(l1->data[i]>l2->data[j]){
- l3->data[k] = l1->data[i];
- i--;
- }else{
- l3->data[k] = l2->data[j];
- j--;
- }
- k++;
- }
- //将剩余元素放入数组
- if(i>=0){
- while(i>=0){
- l3->data[k++] = l1->data[i--];
- }
- }
- if(j>=0){
- while(j>=0){
- l3->data[k++] = l1->data[i--];
- }
- }
- return ;
- }
- /*
- * 某顺序表中存放整形数据,编写算法在O(n)时间复杂,
- * O(1)空间复杂度内完成对顺序表的重新排序,将奇数
- * 放在前面,偶数放在后面
- *
- * 思路:
- * 设置双指针,指针移动,分别找到各自方向的偶
- * 和奇数,然后对调
- * */
-
- void sortByOddAndEven(SqList *list){
- int i = 0;
- int j = list->length;
- while(i>=j){
- //指针指向情况有四种情况,分别对应四种动作:
- //一偶一奇 对换
- //一偶一偶 j--
- //一奇一奇 i++
- //一奇一偶 i++ j++
- if(list->data[i]%2==0 && list->data[j]%2==1){
- int temp = list->data[j];
- list->data[j] = list->data[i];
- list->data[i] = temp;
- }else if(list->data[i]%2==0 && list->data[j]%2==0){
- j--;
- }else if(list->data[i]%2==1 && list->data[j]%2==1){
- i++;
- }else{
- i++;
- j++;
- }
- }
- return ;
- }
- /*
- * 有一单链表,删除单链表中值处于(minx,maxx)之间的元素
- *
- * */
-
- //定义单链表结构
-
- typedef struct LNode{
- int data; //数据域
- struct LNode *next; //指针域
- }LinkList;
-
-
- void delete_between_minx_maxx(LinkList *list,int minx,int maxx){
- //假设链表带头结点
- struct LNode * s = list;
- while(s->next!=NULL){
- if(s->next->data >= minx && s->next->data <= maxx){
- struct LNode *p = s->next;
- //删除当前结点,即p结点
- s->next = p->next;
- free(p);
- }
- s = s->next;
- }
-
- }
- /*
- * 两个单链表递增有序排列,将其合并为一个递减排序的有序单链表
- * 要求:用原表的结点空间存储新的链表
- * */
-
-
- //定义链表结构体
- typedef struct LNode{
- int data; //数据域
- struct LNode *next; //指针域
- }LinkList;
-
-
- void merge(LinkList *list1,LinkList *list2,LinkList *list3){
- //思路:同时遍历两个单链表,链接成一个新的链表
- struct LNode *A = list1->next;
- struct LNode *B = list2->next;
- struct LNode *C = list3;
- while(A!=NULL && B!=NULL){
- //比较AB结点元素的大小
- if(A->data >= B->data){
- C->next = A;
- A = A->next;
- }else{
- C->next = B;
- B = B->next;
- }
- C = C->next;
- }
- //将剩余结点加入C
- while(A!=NULL){
- C->next = A;
- A = A->next;
- C = C->next;
- }
- while(B!=NULL){
- C->next = B;
- B = B->next;
- C = C->next;
- }
- return ;
- }
- /*
- * 将单链表中的三种数据按元素类型分开,分成三个循环链表
- * */
-
- void split(LinkList *list,CycLinkList *c1,CycLinkList *c2,CycLinkList *c3){
- struct LNode *a = list->next;
- struct LNode *b = c1;
- struct LNode *c = c2;
- struct LNode *d = c3;
-
- while(a!=NULL){
- if(isdigit(a->data)){
- b->next = a;
- a = a->next;
- b = b->next;
- }else if(isalpha(a->data)){
- c->next = a;
- a = a->next;
- c = c->next;
- }else{
- d->next = a;
- a = a->next;
- d = d->next;
- }
- }
- b->next = c1;
- c->next = c2;
- d->next = c3;
- return ;
- }
- /*
- * 有连个单链表,交叉排列其元素,多余元素附加于末尾
- * */
-
- void merge(LinkList *list1,LinkList *list2,LinkList *list3){
- struct LNode *a = list1->next;
- struct LNode *b = list2->next;
- struct LNode *c = list3;
- int flag = 0;
- while(a!=NULL && b!=NULL){
- if(flag == 0){
- struct LNode *p = a;
- a = a->next;
- c->next = p;
- c = c->next;
- flag = 1;
- }else if(flag == 1){
- struct LNode *p = b;
- b = b->next;
- c->next = p;
- c = c->next;
- flag = 0;
- }
- }
- //将剩余元素附加到末尾
- if(a!=NULL){
- c->next = a;
- }
- if(b!=NULL){
- c->next = b;
- }
- return ;
- }
-
- /*
- * 一个用单链表表示的稀疏多项式,分解为奇次项和偶次项两个单链表
- * 要求:用原单链表的结点存储
- * */
-
- //定义多项式的单链表表示
- typedef struct FuncLNode{
- int a;
- int index;
- struct FuncLNode * next;
- }FuncLinkList;
-
-
- void split(FuncLinkList *list,FuncLinkList *oddItemList,FuncLinkList *evenItemList){
- struct FuncLnode * s = list->next;
- struct FuncLnode * op = oddItemList;
- struct FuncLnode * ep = evenItemList;
- while(s!=NULL){
- if(s->index%2==0){
- struct FuncLNode *p = s;
- s = s->next;
- op->next = p;
- op = op->next;
- }else{
- struct FuncLNode *p = s;
- s = s->next;
- ep->next = p;
- ep = ep->next;
- }
- }
- op->next = NULL;
- ep->next = NULL;
- return ;
- }
- /*
- * 将顺序表中的元素循环左移p位
- *
- * */
-
- void cycle_left_move(SqList *list,int p){
- //思路:三步翻转法
- // x1 x2 x3 x4 ... xn
- // 翻转前p个元素 xp x(p-1) ... x1 x(p+1) x(p+2) ... xn
- // 翻转后n-p个元素 xp x(p-1) ... x1 x xn x(n-1) ... x(p+1)
- // 翻转整个序列 x(p+1) x(p+2) ... xn x x1 ... xp
- for(int i=0;i<p;i++){
- int temp = list->data[p-i-1];
- list->data[p-i-1] = list->data[i];
- list->data[i] = temp;
- }
- for(int i=p;p<list->length;i++){
- int temp = list->data[list->length-i-1];
- list->data[list->length-i-1] = list->data[i];
- list->data[i] = temp;
- }
- for(int i=0;i<list->length;i++){
- int temp = list->data[list->length-i-1];
- list->data[list->length-i-1] = list->data[i];
- list->data[i] = temp;
- }
- return ;
- }
- /*
- * 带头结点的单链表,查找并输出倒数第k个元素
- * 要求尽可能高效
- * */
-
- void find_endk(LinkList *list,int k){
- //思路:
- // 快慢指针法,设置两个指针,一个指针比另一个指针走快k步,
- // 当一个指针到达尾部时,另一个指针即指向倒数第k个元素
- //
- LNode * i = list->next; //快指针
- LNode * j = list->next; //慢指针
- while(k--){
- //先让快指针走k步
- i = i->next;
- if(i==NULL){
- return ; //链表元素不足k个
- }
- }
- while(i!=NULL){
- i = i->next;
- j = j->next;
- }
- printf("%d",j->data);
- return ;
-
- }
如有错误,尽请指正,我会及时修改,如有问题,也可评论区评论
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。