typedefint ElemType; //ElemType的类型根据实际情况而定,这里假定为int //顺序表数据结构 typedefstruct{ ElemType *elem; int length; }SqList;
1、构造一个空的顺序表
1 2 3 4 5 6 7 8 9
Status InitList(SqList* L){ //构造一个空的线性表 L -> elem = (ElemType *)malloc(MAXSIZE*sizeof(ElemType)); if(!L -> elem){ return ERROR; } L -> length = 0; return OK; }
2、顺序表的插入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Status ListInsert(SqList *L,int i,ElemType e){ int k; if(L -> length == MAXSIZE){ retuen ERROR; } if(i < 1 || i > L -> length+1){ return ERROR; } if(i <= L -> length){ //这个语句判断检查插入位置i是否在表尾之前,如果是,则需要将插入位置之后的元素往后移一位,为新元素腾出一位。注意第i个元素的下标是i-1。 for(k = L -> length-1;k >= i-1;k--){ L -> elem[k+1] = L -> elem[k]; } } L -> elem[i-1] = e; L -> length++; return OK; }
3、顺序表的删除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Status ListDelete(SqList *L, int i, ElemType *e){ int k; if(L -> length == 0){ return0ERROR; } if(i <1 || i > L -> length){ return ERROR; } *e = L -> elem[i-1]; if(i < L -> length){ for(k = i; k < L -> length;k++){ L -> elem[k-1] = L -> elem[k]; } } L -> length--; return OK; }
4、获取顺序表某一个位置的元素
1 2 3 4 5 6 7
Status GetElem(SqList L, int i, ElemType *e){ if (L.length == 0 || i < 1 || i > L.length){ return ERROR; } *e = L.elem[i-1]; return OK; }
5、读取顺序表中所有元素
1 2 3 4 5 6 7
voidOutPut(SqList L){ printf("当前顺序表的长度:%d\n",L.length); for(int i = 0; i < L.length; i++){ printf("%d",L.length[i]); } printf("\n"); }
typedefstructLNode{ int data; structLNode *next; }*LinkList,LNode;
//带头结点的初始化 boolInitlist(LinkList& L){ L = (LNOde*)malloc(sizeof(LNode)); if(L == NULL){ returntrue; } L -> next = NULL; returntrue; }
//尾插法创建一个单链表 boolTailInsert(LinkLinst L){ int num = 0; int ele = 0; LNode *p = L; printf("请输入你要插入的元素个数:\n"); scanf("%d",&num); for(int i = 0;i< num;i++){ printf("请输入第%d个元素:",i+1) scanf("%d",&ele); LNode *s = (LNode*)malloc(sizeof(LNode)); if(s == NULL){ returnfalse; } s -> data = ele; s -> next = NULL; p -> next = s; p = p -> next; } returntrue; }
//合并两个单链表 LinlList mergeList(LinkList L1,LinkList L2){ LNode *head = (LNOde*)malloc(sizeof(LNode)); LNode *p1 = L1 -> next; LNode *p2 = L2 -> next; LNode *pre = head; while(p1 != NULL && p2 != NULL){ if(p1 -> data <= p2 -> data){ //按降序进行连接 pre -> next = p1; p1 = p1 -> next; } else{ pre -> next = p2; p2 = p2 -> next; } pre = pre -> next; } pre -> next = p1 == NULL ? p2 : p1; return head; }
//遍历一个单链表 voidTranverseLinkList(LinkList L){ LNode *p = L -> next; preinf("单链表序列为: "); while(p != NULL){ printf("%d", p -> data); p = p -> next; } }
DLinkList HeadInsert(DLinkList &L){ InitList(L); int x; cin>>x; while(x != 9999){ DNode *s = (DNode *)malloc(sizeof(DNode)); s -> data = x; if(L -> next == NULL){ s -> next =NULL; s -> prior = L; L -> prior = s; }else{ s -> next = L -> next; L -> next -> prior = s; s -> prior = L; L -> next = s; } cin >> x; } return L; }
尾插法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
DLinkList TailInsert(DLinkList &L){ InitList; DNode *s,*r = *L; int x; cin>>x; while(x != 9999){ s = (DNode *)malloc(sizeof(DNode)); s -> data = x; s -> next = NULL; s -> prior = r; r -> next = s; r = s; cin >> x; } return L; }
插入操作
1 2 3 4 5 6 7 8 9
//将x插入到双链表L中*p结点的下一个结点 voidInsert(DLinkList &L, DNode *p,int x){ DNode *s = (DNode *)malloc(sizeof(DNode)); s -> data = x; s -> next = p -> next; //1 p -> next -> prior = s; //2 s -> prior = p; //3 p -> next = s; //4 } //插入语句不是只有这一种顺序,但必须保证1和2是要再4之前,否则*P的后继结点的指针就会丢掉,导致插入失败。
遍历操作
1 2 3 4 5 6 7 8
voidPrintList(DLinkList L){ DNode *p = L -> next; while(p){ cout << p -> data << " "; p = p ->next; } cout << endl }
求长度
1 2 3 4 5 6 7 8 9
intLength(DLinkList L){ DNode *p = L -> next; int len = 0; while(p){ len++; p = p -> next; } return len; }
查找值
1 2 3 4 5 6 7
DNode *LcoateElem(DLinkList L, int x){ DNode *p = L -> next; while(p && p -> next != x){ p = p -> next; } return p; }
删除操作
1 2 3 4 5 6 7 8 9 10 11
voidDelete(DLinkList &L,int i){ if(i < 1 || i > length(L)){ cout <<"delete failed: index is wrong." << endl; return; } DNode *p = GetElem(L ,i-1); DNode *q = p -> next; p -> next = q -> next; q -> next -> prior = p; free(q); }