C语言实现单链表的基本操作

上一篇 / 下一篇  2010-11-03 12:34:25

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct _Person
{
 char name[10];
 char Phone[12];
 struct _Person* next;
}Person;

//初始化
Person* InitList()
{
 Person* temp=NULL;
 temp=(Person*)malloc(sizeof(Person));
 if(temp==NULL)
 {
  return NULL;
 }
 strcpy(temp->name,"");
 strcpy(temp->Phone,"");
 temp->next=NULL;
 return temp;
}

//销毁操作
void UnitList(Person* list)
{
 Person* p1=NULL;
 Person* p2=NULL;
 p1=list->next;
 while(p1!=NULL)
 {
  p2=p1->next;
  free(p1);
  p1=p2;
 }
}

//获取第nPos个元素
Person* GetList(Person* list, int nPos)
{
 int i=1;
 Person* p1;//临时使用指针变量
 if(list==NULL)
  return NULL;

 p1=list->next;

 while(list!=NULL && i<nPos-1 )
 {
  p1=p1->next;
  i++;
 }
 if(p1==NULL)
  return NULL;
 if(i>nPos)
  return NULL;

 return p1 ;
}

//插入操作
Person* InsertList(Person* list, int nPos,Person* pitem)
{
 Person* p1=NULL;
 Person* newnode=NULL;
 Person* node; //临时使用指针变量.
 int i=1;

 if(list==NULL)
  return NULL;
  
 p1=list->next;

 if(p1==NULL &&  nPos==1)  //插入第一个元素
 {
   newnode=(Person*)malloc(sizeof(Person));

 if(newnode==NULL) //分配是否成功
  return list;

 strcpy(newnode->name,pitem->name);
 strcpy(newnode->Phone,pitem->Phone);

 list->next=newnode;
 newnode->next=NULL;
// return list;
 }

 while(p1!=NULL&& i<nPos-1)
 {
  p1=p1->next;
  i++;
 }

 if(p1==NULL)
  return list;

 if(i>nPos)
  return list;

 newnode=(Person*)malloc(sizeof(Person));

 if(newnode==NULL) //分配是否成功
  return list;

 strcpy(newnode->name,pitem->name);
 strcpy(newnode->Phone,pitem->Phone);
/*
 newnode->next=p1->next;//newnode指向P1的下一个元素地址.
 p1->next=newnode;//p1指向新节点地址
*/
 node=p1->next;
 p1->next=newnode;
 newnode->next=node;

 return list;

}

Person* DeleteList(Person* list,int nPos,Person* pDelete)
{
 Person* p1=NULL; //临时使用指针变量
 Person* temp1=NULL;
 Person* temp2=NULL;
 int i=1;

 if(list==NULL)
  return NULL;

  p1=list->next;

 while(p1!=NULL&& i<nPos)
 {
  p1=p1->next;
  i++;
 }

 if(p1==NULL)
  return list;

 if(i>nPos)
  return list;

 temp1=p1->next;

  if(temp1==NULL)
   return list;

 temp2=temp1->next;

 //删除操作;
 p1->next=temp2;

 strcpy(pDelete->name,temp1->name);
 strcpy(pDelete->Phone,temp1->Phone);

 free(temp1);
 temp1=NULL;

 return list;
}

Person* ModifyList(Person* list,int nPos,Person* pModify)
{
 int i=1;
 Person* p1;//临时使用指针变量

 if(list==NULL)
  return NULL;

 p1=list->next;

 while(p1!=NULL&& i<nPos)
 {
  p1=p1->next;
  i++;
 }
 if(p1==NULL)
  return NULL;

 if(i>nPos)
  return NULL;

 strcpy(p1->name,pModify->name);
 strcpy(p1->Phone,pModify->Phone);

 return list;
}

int main()
{
 Person newnode;
 int i = 0;
 Person* head = NULL;
 Person* temp = NULL;
 Person* perget=NULL;

 head = InitList();

 for( i = 0 ;i < 20;i++)
 {
  sprintf(newnode.name ,"good%d",i);
  sprintf(newnode.Phone,"151501000%d",i);
  InsertList(head,i+1,&newnode);
 }
 temp = head->next ;
 if(temp == NULL)
 {
  return 0;
 }
 for( i = 0;temp != NULL;i++)
 {
  printf("name = %-10s phone = %-10s\n",temp->name,temp->Phone);
  temp = temp->next;
 }

 perget=GetList(head,5);

 if(perget!=NULL)
 {
 printf("Get the 10th:\nname = %8s  phone = %8s\n", perget->name, perget->Phone);
 }
 
 return 0;


}


TAG:

 

评分:0

我来说两句

日历

« 2024-05-14  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 18223
  • 日志数: 29
  • 建立时间: 2010-09-25
  • 更新时间: 2010-12-19

RSS订阅

Open Toolbar