一 顺序表
一 思路分析
定义一个顺序表
typedef struct sqlist
{
ElemType *elem;
int length;
int listsize;
}Sqlist;
初始化一个顺序表
void InitList_sq(Sqlist &L){
L.elem=(ElemType*)malloc(LIST_SIZE*sizeof(ElemType));
if(!L.elem) exit(0);
L.length=0;
L.listsize=LIST_SIZE;
}
顺序表的插入
int ListInsert_sq(Sqlist &L,int i,ElemType e){
if(i<1||i> L.length+1) return 0;
if(L.length>L.listsize){
int *newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)exit(0);
L.elem=newbase;
L.listsize=L.listsize+LISTINCREMENT;
}
int *q=&(L.elem[i-1]);
for(int *p=&(L.elem[L.length-1]);p>=q;p--){
*(p+1)=*p;
}
*q=e;
L.length++;
return 1;
}
顺序表的删除
int delete_sq(Sqlist &L,int i,ElemType &e){
if(i<1||i>L.length)return 0;
int *p=&(L.elem[L.length-1]);
int *q=&(L.elem[i-1]);
e=*q;
for(q++;q<=p;q++){
*(q-1)=*q;
}
L.length--;
return e;
}
顺序表的定位(就是输入一个元素,返回他在顺序表中的位序,若不在返回0)
int locate_sq(Sqlist L,ElemType e){
int i=1;
int *p=L.elem;
while(i<=L.length && *p++!=e)i++;
if(i<=L.length) return i;
else return 0;
}
二 全部源码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LIST_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType;
//定义一个顺序表
typedef struct sqlist
{
ElemType *elem;
int length;
int listsize;
}Sqlist;
//初始化顺序表
int InitList_sq(Sqlist &L){
L.elem=(ElemType*)malloc(LIST_SIZE*sizeof(ElemType));
if(!L.elem) exit(0);
L.length=0;
L.listsize=LIST_SIZE;
}
//顺序表的插入
int ListInsert_sq(Sqlist &L,int i,ElemType e){
if(i<1||i> L.length+1) return 0;
if(L.length>L.listsize){
int *newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)exit(0);
L.elem=newbase;
L.listsize=L.listsize+LISTINCREMENT;
}
int *q=&(L.elem[i-1]);
for(int *p=&(L.elem[L.length-1]);p>=q;p--){
*(p+1)=*p;
}
*q=e;
L.length++;
return 1;
}
//顺序表的删除
int delete_sq(Sqlist &L,int i,ElemType &e){
if(i<1||i>L.length)return 0;
int *p=&(L.elem[L.length-1]);
int *q=&(L.elem[i-1]);
e=*q;
for(q++;q<=p;q++){
*(q-1)=*q;
}
L.length--;
return e;
}
//顺序表的定位
int locate_sq(Sqlist L,ElemType e){
int i=1;
int *p=L.elem;
while(i<=L.length && *p++!=e)i++;
if(i<=L.length) return i;
else return 0;
}
int main(){
int e=0 ;
Sqlist L;
InitList_sq(L);
//插入数值
ListInsert_sq(L,1,1);
ListInsert_sq(L,2,2);
ListInsert_sq(L,3,3);
for(int i=0;i<L.length;i++){
printf("%d ",L.elem[i]);
}
printf("\n");
//删除数值
delete_sq(L,1,e);
for(int i=0;i<L.length;i++){
printf("%d ",L.elem[i]);
}
//定位数值
int m=locate_sq(L,3);
printf("\n");
printf("%d",m);
}
三 运行结果
![](https://img-blog.csdnimg.cn/img_convert/bda7a7f700e84936aac2d0b7c2642599.png)
二 链表
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node * next;
}Lnode,*LinkList;
int createList(LinkList &L,int n){
L=(LinkList)malloc(sizeof(Lnode));
LinkList p;
int data;
L->next=NULL;
for(int i=n;i>=1;i--){
p=(LinkList)malloc(sizeof(Lnode));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
}
int LinkLength(LinkList L){
LinkList p;
p=L->next; int k=1;
while(p->next){
p=p->next;
k++;
}
return k;
}
int GetElem(LinkList L,int i,int &e){
LinkList p;
p=L->next;int j=1;
while(p&&j<i){
p=p->next;
j++;
}
if(!p||j>i) return 0;
e=p->data;
return 1;
}
void show(LinkList L){
LinkList q;
q=L->next;
while(q){
printf("%d ",q->data);
q=q->next;
}
}
int add(LinkList &L,int i,int e){
LinkList p;
p=L;int j=0;
while(p&&j<i-1){
p=p->next;
j++;
}
if(!p||j>i-1) return 0;
LinkList s=(LinkList)malloc(sizeof(Lnode));;
s->data=e;
s->next=p->next;
p->next=s;
return 0;
}
int deleteL(LinkList &L,int i,int &m){
LinkList p;
p=L;int j=0;
while(p->next&&j<i-1){
p=p->next;
j++;
}
if(!p->next||j>i-1) return 0;
m=p->next->data;
p->next=p->next->next;
return 0;
}
int main(){
LinkList L;
int e,m;
createList(L,5);
show(L);
printf("\n");
printf("%d\n",LinkLength(L));
GetElem(L,3,e);
printf("%d\n",e);
add(L,2,2);
show(L);
printf("\n");
deleteL(L,2,m);
show(L);
printf("\n");
printf("%d\n",m);
}
![](https://img-blog.csdnimg.cn/img_convert/809e749f4abc40bb97613c2ce45bb3c2.png)
三 实验:一次多项式的表示以及相加
代码
#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -2
#define OK 1
typedef int Status;
typedef struct Lnode{
int a; //a表示系数
int b; //b次数
struct Lnode* next;
}node,*LinkList;
Status createList(LinkList &L,int n){
LinkList p,end;
L=(LinkList)malloc(sizeof(node));
if(!L)exit(OVERFLOW);
L->next=NULL;
end=L;
for(int i=0;i<n;i++){
p=(LinkList)malloc(sizeof(node));
if(!p)exit(OVERFLOW);
scanf("%d %d",&p->a,&p->b);
p->next=NULL;
end->next=p;
end=p;
}
return OK;
}
Status Listadd(LinkList &la,LinkList &lb,LinkList &lc){
LinkList pa,pb,pc,pt;
lc=pc=la;
pa=la->next;
pb=lb->next;
while(pa&&pb){
if(pa->b<pb->b){
pc->next=pa;pc=pa;pa=pa->next;
}
else if(pa->b>pb->b){
pc->next=pb;pc=pb;pb=pb->next;
}
else{
pa->a=pa->a+pb->a;
if(pa->a){
pc->next=pa;
pc=pa;
pa=pa->next;
pt=pb;
pb=pb->next;
free(pt);
}
else{
pt=pa;
pa=pa->next;
free(pt);
pt=pb;
pb=pb->next;
free(pt);
}
}
}
pc->next=NULL;
if(pa) pc->next=pa;
if(pb) pc->next=pb;
free(lb);
return OK;
}
Status printList(LinkList L){
L=L->next;
printf("多项式lc:\n") ;
while(L){
printf("%d %d\n",L->a,L->b);
L=L->next;
}
return OK;
}
int main(){
LinkList la,lb,lc;
int n,m;
printf("输入多项式la中结点的个数:\n");
scanf("%d",&n);
createList(la,n);
printf("输入多项式lb中结点的个数:\n");
scanf("%d",&m);
createList(lb,m);
Listadd(la,lb,lc);
printList(lc);
}
演示
![](https://img-blog.csdnimg.cn/img_convert/53c5ae3e103c48ba9664293e24d199ca.png)