單鏈表儲存結構程式碼--《大話資料結構》程傑
#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; }