1. 定义
(1)顺序存储
typedef struct{ ElemType data[MAXSIZE]; int length;}SqList;
(2)链式存储
typedef struct NODE{ int data; struct NODE *next;}node;
一个结构内部包含一个类型为该结构本身的成员是非法的,但是包含一个指向该结构的指针是合法的。 注意:这里必须要用结构的标签来声明指针。
2. 实现
(1)顺序存储结构的获取元素,插入,删除操作。
#include#include #include #define MAXSIZE 10 #define TRUE 1 #define FALSE 0 typedef struct { int data[MAXSIZE]; int length; }SqList; void SetElem(SqList *L); int GetElem(SqList *L,int i,int *e); int InsertElem(SqList *L,int i,int e); int DeleteElem(SqList *L,int i); void PrintList(SqList *L); int main() { SqList list; int m; SetElem(&list); printf("原线性表: "); PrintList(&list); GetElem(&list,1,&m); printf("第1个元素:%d\n",m); InsertElem(&list,1,10); printf("在第1个位置插入10:"); PrintList(&list); DeleteElem(&list,1); printf("删除第1个位置的元素:"); PrintList(&list); return 0; } void SetElem(SqList *L) { srand((unsigned)time(NULL)); for(int i=0;i data[i]=rand()%100; L->length=MAXSIZE-1; } int GetElem(SqList *L,int i,int *e) { if(L->length==0 || i<1 ||i>L->length) return FALSE; *e=L->data[i-1]; return TRUE; } int InsertElem(SqList *L,int i,int e) //在第i个位置之前插入数据元素e { if(L->length==MAXSIZE || i<1 || i>L->length+1) return FALSE; if(i length+1) { for(int k=L->length-1;k>=i-1;--k) { L->data[k+1]=L->data[k]; } } L->data[i-1]=e; L->length++; return TRUE; } int DeleteElem(SqList *L,int i) //删除第i个位置的数据元素 { if(i<1 || i>L->length) return FALSE; if(i length) { for(int k=i-1;k length-1;++k) L->data[k]=L->data[k+1]; } L->length--; return TRUE; } void PrintList(SqList *L) { for(int i=0;i length;++i) { printf("%d ",L->data[i]); } printf("\n"); }
(2)单链表结构
#include#include #define TRUE 1 #define FALSE 0 typedef struct NODE { int data; NODE *next; }Node; typedef Node *LinkList; void CreateList(LinkList *L,int n); void PrintList(LinkList *L); int InsertElem(LinkList *L,int i,int m); int DeleteElem(LinkList *L,int i); void ClearList(LinkList *L); int main() { LinkList list; CreateList(&list,10); printf("原单链表:"); PrintList(&list); InsertElem(&list,1,100); printf("在第1个元素前插入100: "); PrintList(&list); DeleteElem(&list,11); printf("删除第11个位置的结点:"); PrintList(&list); ClearList(&list); printf("删除整表:"); PrintList(&list); return 0; } /* void CreateList(LinkList *L,int n) //头插法 { LinkList p; int i; *L=(Node*)malloc(sizeof(Node)); (*L)->next=NULL; for(i=0;i data=rand()%100; p->next=(*L)->next; (*L)->next=p; } } */ void CreateList(LinkList *L,int n) //尾插法 { LinkList p,r; int i; *L=(Node*)malloc(sizeof(Node)); r=*L; for(i=0;i data=rand()%100; r->next=p; r=p; } r->next=NULL; } void PrintList(LinkList *L) { Node *p; p=(*L)->next; while(p) { printf("%d ",p->data); p=p->next; } printf("\n"); } int InsertElem(LinkList *L,int i,int m) //在第i个位置前插入一个新结点 { Node *p,*s; p=*L; int j=1; while(p&&j next; ++j; } if(!(p->next) || j>i) { return FALSE; } s=(Node*)malloc(sizeof(Node)); s->data=m; s->next=p->next; p->next=s; return TRUE; } int DeleteElem(LinkList *L,int i) //删除第i个结点 { Node *p,*q; p=*L; int j=1; while(p->next&&j next; ++j; } if(!(p->next) || j>i) return FALSE; q=p->next; p->next=q->next; free(q); return TRUE; } void ClearList(LinkList *L) { Node *p,*q; p=(*L)->next; while(p) { q=p->next; free(p); p=q; } (*L)->next=NULL; }
(3)双向循环链表
#include#include #include #define TRUE 1 #define FALSE 0 typedef struct DulNODE { DulNODE *prior; DulNODE *next; int data; }DulNode; typedef DulNode *DulLinkList; void CreateLinkList(DulLinkList *L,int n); void PrintList(DulLinkList *L); int InsertElem(DulLinkList *L,int i,int m); void DeleteElem(DulLinkList *L,int i); int main() { DulLinkList list; CreateLinkList(&list,10); printf("原双向循环链表:"); PrintList(&list); InsertElem(&list,3,100); printf("在第3个位置后插入100:"); PrintList(&list); DeleteElem(&list,3); printf("删除第3个位置的结点:"); PrintList(&list); return 0; } void CreateLinkList(DulLinkList *L,int n) { DulNode *p,*r; *L=(DulNode*)malloc(sizeof(DulNode)); (*L)->next=*L; (*L)->prior=*L; r=*L; for(int i=0;i data=rand()%100; r->next=p; p->prior=r; r=p; } p->next=*L; (*L)->prior=p; } void PrintList(DulLinkList *L) { DulNode *p; p=(*L)->next; while(p!=(*L)) { printf("%d ",p->data); p=p->next; } printf("\n"); } int InsertElem(DulLinkList *L,int i,int m) //在第i个位置之后插入新元素m { DulNode *p,*s; p=*L; int j=0; while((p->next!=(*L))&&j next; ++j; } s=(DulNode*)malloc(sizeof(DulNode)); s->data=m; s->next=p->next; p->next->prior=s; s->prior=p; p->next=s; return TRUE; } void DeleteElem(DulLinkList *L,int i) //删除第i个位置的结点 { DulNode *p; p=(*L)->next; int j=1; while(p!=(*L)&&j next; ++j; } p->prior->next=p->next; p->next->prior=p->prior; free(p); }