單向鏈表的插入刪除代碼

#include<stdio.h>
#include<malloc.h>
typedef struct NODE{
	    struct NODE*link;
	   int data;
	}Node,*Nodep;


Nodep CreateListH(int n)   //創建有包含頭結點的鏈表
{
	int i;
    Node *L=NULL;
	Node *p=NULL;
	Node *r=NULL;
    L=(Node*)malloc(sizeof(Node));    //頭結點
	L->link=NULL;
	
    r=L;
	for(i=0;i<n;i++)
	{
	    p=(Node*)malloc(sizeof(Node));
	//	p->data=i;
		printf("輸入結點%d的值:\n",i);
		scanf("%d",&p->data);
		r->link=p;
		r=p;
    }
    r->link=NULL;
    return L;

}

Nodep CreateListT(int n)    //逆序創建
{
    Node* L=NULL,*p=NULL;
	int i;
	L=(Node*)malloc(sizeof(Node));
	L->link=NULL;
	for(i=n;i>0;i--)
	{
	   p=(Node*)malloc(sizeof(Node));
	   p->data=i;
	   p->link=L->link;
	   L->link=p;	
	}
    return L;
}

Nodep InsertList(Nodep rootp,int value)    //有對插入第一個結點,中間結點以及尾結點的考慮
{
   Node *current=NULL,*pre=NULL,*new_node=NULL;
   current=rootp->link;
   while(current!=NULL && current->data<value)
   {
        pre=current;
		current=current->link;
   }
   new_node=(Node*)malloc(sizeof(Node));
   if(new_node==NULL)
	   printf("malloc failure");
   new_node->data=value;
   new_node->link=current;
   if(pre==NULL)
	   rootp->link=new_node;
   else
       pre->link=new_node;
   return rootp;
}

Nodep  DeleteList(Nodep rootp,int i)   //尋找第i個結點,並使current指向其前驅
{
    Node*current=NULL;
	Node *q=NULL;
	int j=0;
	current=rootp;
	while(current->link && j<i-1)
	{
		current=current->link;
		++j;
	}
	if(!(current->link) || j>i-1 ) 
	{
		printf("刪除位置不合理\n");
		exit(1);
    }
		q=current->link;
		current->link=q->link;
        free(q);
    return rootp;

}

void ReadList(Nodep rootp)
{
    int value;
    Node * current;
    current=rootp->link;
    while(current!=NULL)
    {
       value=current->data;
	   printf("%d\n",value);
       current=current->link;
    }
}

int main()
{
    Nodep list;
	list=CreateListH(3);
//	ReadList(list);
	//InsertList(list,8);
	DeleteList(list,3);
    ReadList(list);

    return 0;
}

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