單鏈表的的創建,測長,打印,插入(附代碼解析)

具體代碼如下:所實現的是一個帶頭結點的鏈表

/*
單鏈表的插入分爲三種方法,在頭結點插入,在中間插入,在末尾插入
*/

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct node    //創建一個結點,用來存儲信息
{
    int data;
    struct node*next;
 }node;       
 
 node*creat()   //單鏈表的建立
 {
    node*head,*p,*q;
    char ch;
    head=(node*)malloc(sizeof(node));
    q=head;
    ch='*';
    puts("單鏈表尾插法,?結束");   //用?來作爲結束標誌
    while(ch!='?')
    {
        int a; 
        scanf("%d",&a);
        p=(node*)malloc(sizeof(node));
        p->data=a;
        q->next=p;
        q=p;
        ch=getchar();
     }
     q->next=NULL;
     return(head);
 }
 
 void print(node*a)   //單鏈表的打印
 {
    puts("print ");
    a=a->next;
    while(a!=NULL)
    {
        printf("%d ",a->data);
        a=a->next;
     }
  }
  
 int length_node(node *head)  //單鏈表的測長
 {
	 int len=0;
	 node *p=head->next;
	 if(p!=NULL)
	 {
		 len++;
		 p=p->next;
	 }
	 return len;
 }
 
 node* insert_node(node*head,int data,int pos)    //單鏈表的插入,參數爲頭結點,插入的數字大小,插入的位置
 {
	 node* p;      //創建一個要插入的節點
	 int len=length_node(head);   //判斷鏈表的長度
	 
	 p=(node *)malloc(sizeof(node));
	 if(p==NULL)
	 {
		 printf("申請空間失敗");
		 exit(0);
	 }
	 p->data=data;
	 if(pos>len || pos<0)
	 {
		 printf("插入位置不合理\n");
		 exit(0);
	 }
	 if(pos==0)   //插在head後面,即在表頭位置
	 {
		 p->next=head->next;
		 head->next=p;
		 return head;
	 }
	 else if(pos>0)
	 {
		 int i=1;
		 node *q=head->next;
		 for(i=1;i<pos;i++)   
		 {
			 q=q->next;
		 } 
		 if(q->next==NULL)  //插入鏈表末尾
		 {
		    q->next=p;
			p->next==NULL;
		 }
		 else if(q->next!=NULL)
		 {
		    p->next=q->next;   //插入鏈表中間位置
		    q->next=p;
		 }	 	 
	 }
 }

int main()
 {
    node*a;
    a=creat();
    print(a);
	insert_node(a,9,10);
    puts("\nhaved insert:"); 
    print(a);
	printf("\n");
    return 0;
 }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章