剛學了數據結構的單鏈表基本操作:創建,刪除,插入,反轉等,以下是詳細內容,其中很多關於數據結構的表述並不完整,只是簡單的基本算法思想的表現。
由於沒經驗,代碼有點亂·····
如有不當或錯誤之處,歡迎指正,不勝感激!
- #include<stdio.h>
- #include <malloc.h>
- struct node
- {
- int data;
- struct node* next;
- }head;
- struct node *p,*q;//聲明臨時節點
- void head_insert(int x)//從頭部插入新節點
- {
-
- p=(struct node*)malloc(sizeof(struct node));
- if(p==NULL)
- {
- printf("內存申請失敗,退出");
- exit(0);
- }
- p->data=x;
- p->next=head.next;
- head.next=p;
- }
- void tail_insert(int x)//從尾部插入節點
- {
-
- p=(struct node*)malloc(sizeof(struct node));
- if(p==NULL)
- {
- printf("內存申請失敗,退出");
- exit(0);
- }
- p->data=x;
- p->next=NULL;
- q->next=p;
- q=p;
- }
- void node_length()//輸出鏈表長度
- {
- int length=0;
- p=head.next;
- if(p==NULL) printf("The length of node is 0.\n");
- else
- {
- do
- {
- length++;
- p=p->next;
- } while(p);
- printf("The length of node is %d.\n",length);
- }
- }
- void print_node()//打印鏈表
- {
- printf("輸出此時鏈表:\n");
- p=head.next;
- if(p==NULL) {printf("NULL\n");return;}
- else
- {
- while(p)
- {
- printf("%d ",p->data);
- p=p->next;
- }
- printf("\n");
- }
-
- }
- void clear_node()//清空鏈表
- {
- p=head.next;
- head.next=NULL;
- while(p)
- {
- q=p;
- p=p->next;
- free(q);
- }
- }
- void new_insert(int i,int a)//在第i個位置後插入新整型元素 a
- {
- q=(struct node*)malloc(sizeof(struct node));
- q->data=a;
- p=head.next;
- if(i<0) printf("Position Error.\n");
- else
- {
- while(p&&--i) p=p->next;
- if(i) printf("Position Error.\n");
- else
- {
- q->next=p->next;
- p->next=q;
- }
- }
- }
- void delete_node(int i)//刪除某節點
- {
- p=&head;
- while(p->next&&--i)
- p=p->next;
- if(i) printf("Position Error.\n");
- else
- {
- q=p->next;
- p->next=q->next;
- free(q);
- }
- }
- void invert_order()//將鏈表反轉
- {
- node *This,*prev;
- p=head.next;
- This=NULL;
- while(p)
- {
- prev=This;
- This=p;
- p=p->next;
- This->next=prev;
-
- }
- head.next=This;
- }
- int main()
- {
- int number,i,a;
- head.next=NULL;
- q=&head;
- printf("輸入整型數據:\n");
- while(scanf("%d",&number)!=EOF) //將數據存入鏈表
- {
- head_insert(number);//從頭插入 即逆序插入
-
- /* tail_insert(number); 從尾端 插入即正序插入 */
- }
- invert_order();
- node_length();//輸出鏈表長度
- print_node();//輸出鏈表
- printf("在第i個位置後插入a,請輸入i和a:\n");
- scanf("%d%d",&i,&a);
- new_insert(i,a);
- print_node();
- printf("輸入要刪除的第i個結點:\n");
- scanf("%d",&i);
- delete_node(i);
- print_node();
- clear_node();
- return 0;
- }
附:在Windows下,輸入數據完畢後先按Enter鍵,再按Ctrl+Z鍵,最後按Enter鍵即可結束輸入;在Linux下,輸入完畢後按Ctrl+D鍵可結束輸入。