单链表的创建
在进行单链表的基本运算之前必须先建立单链表,建立单链表的常用方法有两种:头插法建表和尾插法建表
头插法建表,从一个空表开始,读取字符数组a中的字符,生成新节点,将读取的数据存放到新节点的数据域中,然后将新节点插入到当前链表的表头上,直到读完字符数组a的所有元素为止。
核心代码:
s->next = L->next; // 新节点指向开始节点 L-next = s; // 头结点指向s节点,使s成为开始节点
头插法建表虽然简单,但生成的链表中节点的次序和原数组的次序相反,若希望两者的次序一致,可采用尾插法建立
尾插法建表,该算法是将新节点插到当前链表的表尾上,为此必须增加一个尾指针r,使其始终指向当前链表的尾节点
核心代码:
r->next=s;//将s插入到r后 r在前面初始化为 r = L r是尾指针 r=s;//使r指向尾结点
实现代码:
1 #include <cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 6 using namespace std; 7 8 typedef int ElemType; 9 typedef struct LNode{ 10 ElemType data; //存放元素值 11 struct LNode *next;//指针域指向后继结点 12 }ListNode; 13 14 15 //头插法建表 16 void CreateListHead(ListNode *&L,ElemType a[],int n){ 17 18 ListNode *s; 19 L=(ListNode *)malloc(sizeof(ListNode));//创建头结点 20 L->next=NULL; //将头结点next域置空 21 22 for(int i=0;i<n;i++){ //循环建立数据结点 23 //创建数据结点*s 24 s=(ListNode *)malloc(sizeof(ListNode)); 25 26 //将结点s插在原开始节点之前,头结点之后 27 s->data=a[i]; 28 s->next=L->next; 29 L->next=s; 30 } 31 } 32 33 //尾插法建表 34 void CreateListTail(ListNode *&L,ElemType a[],int n){ 35 ListNode *s,*r; 36 L=(ListNode *)malloc(sizeof(ListNode));//创建头结点 37 L->next = NULL; //将头结点next域置空 38 r=L;//r始终指向尾结点,开始时头结点和尾结点是同一个 39 40 for(int i=0;i<n;i++){ 41 s=(ListNode *)malloc(sizeof(ListNode));//创建数据结点 42 43 s->data=a[i];//数据域 44 r->next=s;//将s插入到r后 45 r=s;//使r指向尾结点 46 } 47 48 r->next=NULL;//尾指针指针域置空 49 50 } 51 //输出 52 void DispList(ListNode *L){ 53 ListNode *p=L->next;//p指向开始结点 54 55 while(p!=NULL) 56 { 57 cout<<p->data<<" "; //输出数据域 58 p=p->next; 59 } 60 cout<<endl; 61 } 62 int main(){ 63 ListNode *L; 64 int n; 65 cout<<"n:"; 66 cin>>n; 67 68 int *a=new int(n); 69 for(int i=0;i<n;i++){ 70 cin>>a[i]; 71 } 72 //头插法建表 73 CreateListHead(L,a,n); 74 cout<<"头插法建表:"; 75 DispList(L);//输出 76 77 //尾插法建表 78 CreateListTail(L,a,n); 79 cout<<"尾插法建表:"; 80 DispList(L);//输出 81 }
参考: