69,371
社区成员
发帖
与我相关
我的任务
分享
//LinkList.h
#ifndef LINKLIST_H_
#define LINKLIST_H_
#ifndef constant
#define constant
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#include <stdlib.h>
typedef int Status;
#endif /* constant */
typedef int LLElemType;
typedef struct LNode{
LLElemType data;
struct LNode *next;
}LNode,LinkList;
Status InitList_Link(LinkList **L);
Status CreateListF_Link(LinkList **L,LLElemType elem[],int n);
LinkList* CreateListFF_Link(LLElemType elem[],int n);
Status CreateListR_Link(LinkList **L,LLElemType elem[],int n);
LinkList* CreateListRR_Link(LLElemType elem[],int n);
Status DestroyList_Link(LinkList *L);
Status ClearList_Link(LinkList *L);
int EmptyList_Link(LinkList *L);
int LengthList_Link(LinkList *L);
Status GetElem_Link(LinkList *L,int i,LLElemType *e);
int LocateElem_Link(LinkList *L,LLElemType e);
Status InsertList_Link(LinkList *L,int i,LLElemType e);
Status DeleteList_Link(LinkList *L,int i,LLElemType *e);
#endif /* LINKLIST_H_ */
//LinkList.c
#include "LinkList.h"
Status InitList_Link(LinkList **L){
*L=(LinkList *)malloc(sizeof(LinkList));
(*L)->next=NULL;
return OK;
}
Status CreateListF_Link(LinkList **L,LLElemType elem[],int n){
LNode *p;
int i;
*L=(LinkList *)malloc(sizeof(LinkList));
(*L)->next=NULL;
for(i=0;i<n;i++){
p=(LNode *)malloc(sizeof(LNode));
p->data=elem[i];
p->next=(*L)->next;
(*L)->next=p;
}
return OK;
}
LinkList* CreateListFF_Link(LLElemType elem[],int n){
LNode *head,*p;
int i;
head=(LinkList *)malloc(sizeof(LinkList));
head->next=NULL;
for(i=0;i<n;i++)
{
p=(LNode *)malloc(sizeof(LNode));
p->data=elem[i];
p->next=head->next;
head->next=p;
}
return head;
}
int CreateListR_Link(LinkList **L,LLElemType elem[],int n){
LNode *p,*q;
int i;
*L=(LinkList *)malloc(sizeof(LinkList));
p=*L;
for(i=0;i<n;i++){
q=(LNode *)malloc(sizeof(LNode));
q->data=elem[i];
p->next=q;
p=q;
}
p->next=NULL;
return OK;
}
LinkList* CreateListRR_Link(LLElemType elem[],int n){
LNode *head,*p,*q;
int i;
head=(LinkList *)malloc(sizeof(LinkList));
p=head;
for(i=0;i<n;i++){
q=(LNode *)malloc(sizeof(LNode));
q->data=elem[i];
p->next=q;
p=q;
}
p->next=NULL;
return head;
}
Status DestroyList_Link(LinkList *L){
LNode *p,*q;
p=L;q=p->next;
while(q!=NULL){
free(p);
p=q;
q=q->next;
}
free(p);
return OK;
}
Status ClearList_Link(LinkList *L){
LNode *p,*q;
p=L;
while(p->next!=NULL){
q=p->next;
p->next=q->next;
free(q);
}
return OK;
}
int EmptyList_Link(LinkList *L){
return L->next==NULL;
}
int LengthList_Link(LinkList *L){
int n=0;
LNode *p=L;
p=p->next;
while(p!=NULL){
n++;
p=p->next;
}
return n;
}
Status GetElem_Link(LinkList *L,int i,LLElemType *e){
int n=0;
LNode *p;
if(i<1 ||i>LengthList_Link(L)) return ERROR;
p=L->next;
while(p!=NULL){
if ((n++)==i-1)
*e=p->data;
p=p->next;
}
return OK;
}
int LocateElem_Link(LinkList *L,LLElemType e){
LNode *p;
int n=0;
p=L->next;
while(p!=NULL){
n++;
if(e==p->data)
return n;
else
p=p->next;
}
return 0;
}
Status InsertList_Link(LinkList *L,int i,LLElemType e){
int n=0;
LNode *p,*q;
if(i<1 || i>LengthList_Link(L)+1) return ERROR;
p=L;
while(n<i-1 && p!=NULL){
n++;
p=p->next;
}
q=(LNode *)malloc(sizeof(LNode));
q->data=e;
q->next=p->next;
p->next=q;
return OK;
}
Status DeleteList_Link(LinkList *L,int i,LLElemType *e){
int n=0;
LNode *p,*q;
if(i<1 || i>LengthList_Link(L)) return ERROR;
p=L;
while(n<i-1 && p!=NULL){
n++;
p=p->next;
}
q=p->next;
p->next=q->next;
*e=q->data;
free(q);
return OK;
}
//mainTest.c
#include "LinkList.h"
#include <stdio.h>
int main(){
LinkList *L;
int i;
LLElemType ee;
InitList_Link(&L);
for(i=0;i<10;i++){
InsertList_Link(L,(i+1),2*i+1);
}
GetElem_Link(L,1,&ee);
printf("%d\n",ee);
printf("%d\n",LengthList_Link(L));
DestroyList_Link(L);
return 0;
}
//带表头结点的单向链表
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
struct NODE {
int data;
struct NODE *next;
} H,*head,*p,*q,*s1,*s2,*s3,*s4,*s;
int i,j,k,n,t,m;
int main() {
srand(time(NULL));
//填写头节点数据
H.data=-1;
H.next=NULL;
head=&H;
//创建10个节点的单链表
p=head;
for (i=0;i<10;i++) {
q=(struct NODE *)malloc(sizeof(struct NODE));
if (NULL==q) return 1;
q->data=rand()%100;//填写0..99的随机值
q->next=NULL;
p->next=q;
p=q;
}
//输出整个单链表
s=head->next;
while (1) {
if (NULL==s) {
printf("\n");
break;
}
printf("%02d->",s->data);
s=s->next;
}
//将值为5的结点插入到单链表的第k个结点前
k=3;
n=0;
p=head;
while (1) {
if (NULL==p) {
break;
}
n++;
if (k==n) {
q=(struct NODE *)malloc(sizeof(struct NODE));
if (NULL==q) return 1;
q->data=5;
q->next=p->next;
p->next=q;
break;
}
p=p->next;
}
//输出整个单链表
s=head->next;
while (1) {
if (NULL==s) {
printf("\n");
break;
}
printf("%02d->",s->data);
s=s->next;
}
//删除第k个节点
k=5;
n=0;
p=head;
while (1) {
if (NULL==p) {
break;
}
n++;
if (k==n) {
q=p->next;
if (q) {
p->next=q->next;
free(q);
}
break;
}
p=p->next;
}
//输出整个单链表
s=head->next;
while (1) {
if (NULL==s) {
printf("\n");
break;
}
printf("%02d->",s->data);
s=s->next;
}
//从小到大排序
for (p=head;p!=NULL && p->next!=NULL;p=p->next) {
for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {
if (p->next->data > q->next->data) {
//交换data
// printf("swap %02d %02d\n",p->next->data,q->next->data);
// t=p->next->data;p->next->data=q->next->data;q->next->data=t;
//或者
//交换next
// printf("swap %02d %02d\n",p->next->data,q->next->data);
s1=p->next;
s2=p->next->next;
s3=q->next;
s4=q->next->next;
if (s2!=s3) {
p->next=s3;
s3->next=s2;
q->next=s1;
s1->next=s4;
} else {
p->next=s3;
s3->next=s1;
q=s3;
s1->next=s4;
}
//输出整个单链表
// s=head->next;
// while (1) {
// if (NULL==s) {
// printf("\n");
// break;
// }
// printf("%02d->",s->data);
// s=s->next;
// }
// getchar();
}
}
}
//输出整个单链表
s=head->next;
while (1) {
if (NULL==s) {
printf("\n");
break;
}
printf("%02d->",s->data);
s=s->next;
}
//将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10
m=4;
n=6;
k=0;
p=head;
while (1) {
if (NULL==p) {
break;
}
k++;
if (m+1==k) {
q=p;
}
s=p;
p=p->next;
}
s1=head->next;
head->next=q->next;
s->next=s1;
q->next=NULL;
//输出整个单链表
s=head->next;
while (1) {
if (NULL==s) {
printf("\n");
break;
}
printf("%02d->",s->data);
s=s->next;
}
//释放所有节点
p=head->next;
while (1) {
if (NULL==p) {
break;
}
q=p->next;
free(p);
p=q;
}
return 0;
}
//18->94->58->17->27->20->43->57->75->78->
//18->94->05->58->17->27->20->43->57->75->78->
//18->94->05->58->27->20->43->57->75->78->
//05->18->20->27->43->57->58->75->78->94->
//43->57->58->75->78->94->05->18->20->27->
//
#include <iostream>
using namespace std;
#include <ctime>
//链表的数据准备
typedef struct ListNode
{
int n_nkey;
ListNode * pNext;
}Node;
//追加结点:首先分配内存空间,保存新增的结点
// 从头指针head开始逐个检查,直到找到最后一个结点
// 将表尾结点的地址设置为新增结点的地址
// 将新增结点的地址部分设置为空地址null,即新结点成为表尾
Node * NodeAdd(Node * head,int n)
{
Node * p1,* p2;
if (!(p1 = new Node[sizeof(Node)]))
{
cout<<"申请内存失败!\n";
return NULL;
}else
{
//把p1设置成表尾
p1->n_nkey = n;
p1->pNext = NULL;
if (head == NULL)//头指针
{
head = p1;
return head;
}
p2 = head;
//查找链表的末尾
while (p2->pNext != NULL)
{
p2 = p2->pNext;
}
p2->pNext = p1;
return head;
}
}
//插入头结点:首先分配内存空间,保存新增的结点
// 使新增结点指向头指针head所指向的结点
// 然后使头指针head指向新增结点
Node * NodeAddFirst(Node *head,int n)
{
Node * p1;
if (!(p1 = new Node[sizeof(Node)]))
{
cout<<"申请内存失败!\n";
return NULL;
}else
{
p1->n_nkey = n;
//指向头指针所指结点
p1->pNext = head;
//头指针指向新增结点
head = p1;
return head;
}
}
//查找结点
Node * FindNode(Node * head,int key)
{
Node * pTemp;
//保存链表头指针
pTemp = head;
while (pTemp) //若结点有效,则进行查找
{
if (pTemp->n_nkey == key) //诺结点关键字与传入关键字相同
{
return pTemp;
}
pTemp = pTemp->pNext;
}
return NULL;
}
//插入结点:首先分配内存空间,保存新增结点
// 找到要插入的逻辑位置,也就是位于哪两个结点之间
// 修改插入位置结点的指针,使其指向新增结点,而使新增结点指向原插入位置所指向的结点
Node * InsertNode(Node *head,int findkey,int n)
{
Node * p1,*p2;
//分配保存结点的内容
if (!(p1 = new Node[sizeof(Node)]))
{
cout<<"申请内存失败!\n";
return NULL;
}
p1->n_nkey = n;
p2 = FindNode(head,findkey);
if (p2)//成功找到结点
{
p1->pNext = p2->pNext;
p2->pNext = p1;
}else
{
cout<<"未找到正确的插入位置!\n";
delete [] p1;
}
return head;
}
//删除结点:查找到需要删除的结点
// 使前一结点指向当前结点的下一结点
// 删除结点。
int DeleteNode(Node *head,int key)
{
Node *p1,*p2; //p1保存删除结点的前一结点
p2 = head;
p1 = head;
while (p2)
{
if (p2->n_nkey == key)
{
p1->pNext = p2->pNext;
delete p2;
return 1;
}else
{
p1 = p2;
p2 = p2->pNext;
}
}
return 0;
}
//计算链表长度
int NodeLength(Node *head)
{
Node *pTemp;
int Len =0;
pTemp = head;
while (pTemp) //遍历整个链表
{
Len ++;
pTemp = pTemp->pNext;
}
return Len;
}
//显示所有结点
void ALLNode(Node * head)
{
Node * pTemp;
int Num;
pTemp = head;
while (pTemp)
{
Num = pTemp->n_nkey;
cout<<Num<<" ";
pTemp = pTemp->pNext;
}
cout<<endl;
}
//删除重复结点:先排序,然后如果相邻两个相等则删除后面哪个
Node * DeleteRepetitionNode(Node * head)
{
//对链表进行排序
int nLen = NodeLength(head);
Node *P1,*P2;
P1 = head;
if (nLen<2)
{
return head;
}
//此时nLen不小于2,则p2 = p1.pNext存在
for (int i=0;i<nLen;i++)
{
P1 = head;
while (P1->pNext != NULL)
{
//两两比较
P2 = P1->pNext;
if (P1->n_nkey > P2->n_nkey)
{
int temp = P1->n_nkey;
P1->n_nkey = P2->n_nkey;
P2->n_nkey = temp;
}
if (P2->pNext != NULL)
{
P1 = P1->pNext;
}else
{
P1 = P1->pNext;
break;
}
}
}
//删除重复数据,记得要更新p1 p2
P1 = head;
while (P1->pNext != NULL)
{
//两两比较
P2 = P1->pNext;
if (P1->n_nkey == P2->n_nkey)
{
//把第二个结点的指针赋值给前一个结点
P1->pNext = P2->pNext;
delete P2;
}else
{
P1 = P1->pNext;
}
}
return head;
}
int main()
{
srand(time(0));
Node *node,*head = NULL;
//通过追加结点的方式添加10个结点
for (int i=0;i<10;i++)
{
int N = rand()/1000;
head = NodeAdd(head,N);
}
//显示所有结点
ALLNode(head);
//删除重复结点
head = DeleteRepetitionNode(head);
//显示所有结点
ALLNode(head);
return 0;
}