内容一,带头结点的单链表建立
头文件LinkedList.h
含有一些链表的 基本操作
typedef char DataType; typedef struct node { DataType data; struct node *next; }LinkedList; //置空表 void InitList(LinkedList *L) { L->next=NULL; } //获取表长 int GetListLength(LinkedList *L) { LinkedList *p; int len=0; p=L->next; while(p!=NULL) { len++; p=p->next; } return len; } //取结点,查找链表中的第pos个位置(从1开始计数)的元素。未找到返回NULL。 LinkedList* GetListElem(LinkedList *L,int pos) { //获取表长 int now=0; LinkedList *p=L->next; //超出范围 if(pos > GetListLength(L) || pos<1) return NULL; //查找。。 while(p!=NULL) { now++; if(now == pos) { return p; } else { p=p->next; } } return NULL; } //带头结点的单链表。查找key值所在结点,未找到返回NULL LinkedList* LocateListElem(LinkedList* L,DataType key) { LinkedList* p=L->next; while(p!=NULL) { if(p->data==key) { return p; } else { p=p->next; } } return NULL; } //带头结点的单链表。插入元素。pos:插入位置。key插入值,成功返回1,插入失败返回0。 int InsertList(LinkedList *L,int pos,DataType key) { LinkedList *p,*newNode; int len=GetListLength(L); //新建结点 newNode= new struct node; newNode->data=key; newNode->next=NULL; //检查插入范围 if( pos>=1 && pos <=len+1) { //插入到1~len之间 p=GetListElem(L,pos-1); if(p==NULL) { //必为空表中插入第一个元素 L->next=newNode; return 1; } newNode->next=p->next; p->next=newNode; return 1; } else { return 0; } } //带头结点的单链表。删除pos这个位置的元素,并且将这个元素的值保存在e中。删除成功返回1,失败返回0。 int DelListElem(LinkedList *L,int pos,DataType *e) { LinkedList *p,*pre; int len=GetListLength(L); if(pos<1 || pos> len) return -1; //得到该位置的元素 p=GetListElem(L,pos); //得到该位置的前一个元素 pre = GetListElem(L,pos-1); if(pre==NULL) { //说明pos是第一个位置 pre=L; } if(e!=NULL) *e=p->data; pre->next=p->next; return 1; } //带头结点的单链表。建立链表。尾插法。 LinkedList* CreateListR(DataType keys[],int n) { LinkedList *L=new LinkedList, *p, *pre; int i; L->next=NULL; pre=L; for(i=0;i<n;i++) { p = new struct node; p->data=keys[i]; p->next=NULL; pre->next=p; pre=p; } return L; } //带头结点的单链表。建立链表。头插法。 LinkedList* CreateList(DataType keys[],int n) { LinkedList *L=new LinkedList, *p, *pre; int i; L->next=NULL; pre=L; for(i=0;i<n;i++) { p = new struct node; p->data=keys[i]; p->next=L->next; L->next=p; } return L; } //带头结点的单链表。按照结点顺序,以字符方式输出链表。 void PrintList(LinkedList *L) { LinkedList *p=L->next; printf("字符链表结果:\n( "); while (p!=NULL) { //将datatype按照字符类型输出 printf("%c ",p->data); p=p->next; } printf(")\n"); } void PrintListInline(LinkedList *L) { LinkedList *p=L->next; printf("("); while (p!=NULL) { //将datatype按照字符类型输出 printf("%c",p->data); p=p->next; if (p != NULL) { printf(", "); } } printf(")\n"); } DataType* ToArray(LinkedList* L,int *length) { int len=GetListLength(L),i=0; DataType* dt=new DataType[len]; LinkedList *p=L->next; while (p!=NULL) { dt[i++]=p->data; p=p->next; } *length=len; return dt; } void TestLinkedList() { char str[50]; int len=0; LinkedList *L1,*L2; scanf("%s",str); while(str[len]) len++; //尾插法 L1=CreateListR(str,len); //头插法 L2=CreateList(str,len); //清空 InitList(L1); PrintList(L1); //插入 InsertList(L1,1,'1'); PrintList(L1); InsertList(L1,2,'2'); PrintList(L1); InsertList(L1,2,'3'); PrintList(L1); InsertList(L1,2,'4'); PrintList(L1); //删除 DelListElem(L1,1,NULL); PrintList(L1); DelListElem(L1,5,NULL); PrintList(L1); DelListElem(L1,3,NULL); PrintList(L1); gets(str); }