#include<iostream> #include<stdio.h> #include<ctime>
using namespace std;
//线性表链式存储的结构代码 #define ok 1 #define error 0
typedef int Elemtype; typedef int status;
//定义 typedef struct Node { Elemtype data; struct Node *next; }Node; typedef struct Node* linklist;
//这是定义一个结构体,这个结构体有两个属性,一个是int类型的data; 另一个是这个结构体本身类型的指针next; //给这个结构定义了一个指针别名:LinkList; //Node a; 声明一个struct Node结构体类型的结构体变量a; //LinkList b; 等价于 struct Node* b; 等价于 Node *b; 声明一个struct Node结构体类型的指针变量 b;
//操作 void Creatlistheadz(linklist *L,int n); void Creatlisttail(linklist *L,int n); status Clearlist(linklist *L); status Listinsert(linklist *L,int i,Elemtype e); status Listdelete(linklist *L,int i,Elemtype *e); void Inputlist(linklist L);
//单链表整表创建(头插法) void Creatlistheadz(linklist *L,int n) { linklist p; int i; srand(time(0)); *L=(linklist)malloc(sizeof (Node)); (*L)->next=NULL; //建立一个带头结点的单链表 for(i=0;i<n;i++) { p=(linklist)malloc(sizeof(Node)); p->data=rand()%100+1; p->next=(*L)->next; (*L)->next=p; } }
//单链表整表创建(尾插法) void Creatlisttail(linklist *L,int n) { linklist p,r; int i; srand(time(0)); *L=(linklist)malloc(sizeof (Node)); //建立一个带头结点的单链表 r=*L; //r为指向尾部的结点
注意:*L和r的区别,一个是链表,一个是结点
for(i=0;i<n;i++) { p=(linklist)malloc(sizeof(Node)); p->data=rand()%100+1; r->next=p; r=p; } r->next=NULL; }
//删除单链表 status Clearlist(linklist *L) { linklist p,q; p=(*L)->next; //p指向第一个结点 while(p) { q=p->next; free(p); p=q; } (*L)->next=NULL; //头结点的指针域为空 return ok; } //获得元素 status Getelem(linklist L,int i,Elemtype *e) { int j; linklist p; p=L->next; j=1; while(p&&j<i) { p=p->next; ++j; } if(!p||j>i) return error; *e=p->data;
return ok; }
//插入算法 status Listinsert(linklist *L,int i,Elemtype e) { int j; linklist p,s; p=*L; j=1; while(p&&j<i) { p=p->next; ++j; } if(!p||j>i) return error;
s=(linklist)malloc(sizeof(Node)); s->data=e;
s->next=p->next; p->next=s; return ok; }
//删除算法 status Listdelete(linklist *L,int i,Elemtype *e) { int j; linklist p,q; p=*L; j=1; while(p&&j<i) { p=p->next; ++j; } if(!p||j>i) return error; q=p->next; p->next=q->next;
free(q); //回收节点,释放内存 return ok; }
void Inputlist(linklist L) { linklist p; p=L->next; int i=1,a; while(p) { a=p->data; cout<<"第"<<i<<"个结点的值为:"<<a<<endl; p=p->next; i++; } }
int main() { linklist L; int e=0; int b=20; cout<<"创建一个新的单链表:"<<endl; Creatlistheadz( &L,10); Inputlist(L);
cout<<"添加一个新的结点后单链表为:"<<endl; Listinsert(&L,6,b); Inputlist(L);
cout<<"删除一个结点后单链表为:"<<endl; Listdelete(&L,8,&e); Inputlist(L);
cout<<"--------------------------"<<endl; Getelem(L,5,&e); cout<<"e="<<e<<endl;
system("pause"); return 0; }
